%20%D0%BD%D0%B0%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5..png)
Выполнить команду на удаленной системе с локального компьютера
Мне нужно выполнить команду на удаленной системе Lubuntu 22.04 через SSH-соединение, но без открытия оболочки.Эта инструкция будет выполнена внутри скрипта.Скрипт выполняется на моей локальной системе (где установлен другой дистрибутив Ubuntu). Я обнаружил, что могу сделать это с успехом, выполнив на локальной системе следующий скрипт:
# define a variable which stored the password
MYPASSWORD='mypassword'
sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"
В команде, которую я использовал sshpass
(которая установлена в моей локальной системе), чтобы избежать ввода пароля пользователя, myuser
необходимого для аутентификации сеанса SSH.
Мои потребности
Мне также нужно выполнить cp
команду, как и предыдущая, но место назначения для файла — подпапка, /etc
и для этого нужны sudo
привилегии. Таким образом, скрипт становится:
MYPASSWORD='mypassword'
sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S cp /home/myuser/file1 /etc/sub/folder/"
Если я выполню скрипт, последняя команда скрипта выведет следующий запрос:
[sudo] password for myuser:
Поэтому скрипт останавливает выполнение и ждет ввода sudo
пароля.
Я не хочу этого!
Моя попытка
Если я выполню команду:
> echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/
напрямуюна терминале удаленной системыон работает и копирует file1
без /etc/sub/folder/
запроса sudo
пароля.
Но если я выполню следующую командув моей локальной системе:
sshpass -p 'mypassword' ssh [email protected] "echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/"
это не работает!
Мой вопрос
Есть ли способ избежать ввода пароля с sudo
клавиатуры? Можно ли отправить пароль автоматически?
решение1
Я нашел обходной путь/решение.
Использование файла, в котором временно хранится парольsudo
Я изменил скрипт, выполняемый в локальной системе, добавив несколько команд, показанных ниже:
- создание текстового файла в папке удаленной системы командой
echo
; файл называетсяpassword.txt
и содержит только пароль ("mypassword"
) для пользователяmyuser
. - файл
password.txt
напрямую вводится вsudo
команду оператором<
. - выполнение команды
sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
- удаление файла /home/myuser/password.txt из удаленной системы
Это решение используется в безопасной среде разработки, поэтому не нарушает никаких ограничений безопасности.
Новый сценарий
С помощью этих инструкций скрипт, выполняемый в локальной системе, становится следующим:
MYPASSWORD='mypassword'
# creation of the file password.txt on the home folder of the remote system
sshpass -p $MYPASSWORD ssh [email protected] "echo $MYPASSWORD > /home/myuser/password.txt"
# execution of the command which needs the sudo privileges (on remote system)
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/"
# The '<' directs file passowrd.txt as input to sudo ===========================
# deletion of the file password.txt
sshpass -p $MYPASSWORD ssh [email protected] rm /home/myuser/password.txt
Подавить выводsudo -S
Я нашел еще одно улучшение, которое позволяет подавить вывод ( [sudo] password for myuser:
) команды sudo -S
, которая отправляется из ssh в локальную систему.
Достаточно использовать оператор &>
и /dev/null
устройство, как показано ниже:
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S \
< /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/" &> /dev/null
ПримечаниеВ моей локальной системе подавление вывода [sudo] password for myuser:
работает с помощью следующих перенаправлений:
&>/dev/null
>&/dev/null
и это нормально, поскольку предыдущие операторы эквивалентны (см.эта почтана SuperUser).
Подавлениене работаетследующим перенаправлением:
>/dev/null