С помощью скрипта bash, выполняемого на локальном компьютере, выполните команду (с привилегиями sudo) на удаленном сервере.

С помощью скрипта bash, выполняемого на локальном компьютере, выполните команду (с привилегиями sudo) на удаленном сервере.

Выполнить команду на удаленной системе с локального компьютера

Мне нужно выполнить команду на удаленной системе 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

Связанный контент