Правильный способ sudo over ssh

У меня есть script, который запускает другой script через SSH на удаленном сервере, используя sudo. Однако, когда я набираю пароль, он отображается на терминале. (В противном случае он отлично работает)

ssh [email protected] "sudo script"

Каков правильный способ сделать это, чтобы я мог ввести пароль для sudo через SSH без пароля, появляющегося при вводе?

Ответ 1

Другой способ - использовать переключатель -t для ssh:

ssh -t [email protected] "sudo script"

Смотрите man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

Ответ 2

Я смог полностью автоматизировать его с помощью следующей команды:

echo pass | ssh -tt [email protected] "sudo script"

Преимущества:

  • запрос пароля отсутствует
  • не будет показывать пароль в истории удаленной машины

Что касается безопасности:, как сказал Курт, при запуске этой команды ваш пароль будет отображаться в вашей локальной истории bash, и лучше сохранить пароль в другом файле или сохранить команду all в файле .sh. и выполнить его. ПРИМЕЧАНИЕ. Файл должен иметь правильные разрешения, чтобы к нему могли иметь доступ только разрешенные пользователи.

Ответ 3

Предполагая, что вы не хотите запрашивать пароль:

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
Пример

Example

ssh [email protected] 'echo secret | sudo -S echo hi' # outputs 'hi'

Ответ 4

Sudo через SSH с передачей пароля, tty не требуется:

Вы можете использовать sudo поверх ssh, не заставляя ssh иметь псевдо -t (без использования переключателя ssh "-t"), указав sudo не требовать интерактивный пароль и просто получить пароль от стандартного ввода. Это можно сделать с помощью переключателя "-S" на sudo. Это заставляет sudo прослушивать пароль в stdin и прекращать прослушивание, когда видит новую строку.

Пример 1. Простая удаленная команда

В этом примере мы отправляем простую команду whoami:

$ ssh [email protected] cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

Мы говорим sudo не выдавать приглашение и принимать его от stdin. Это делает передачу пароля sudo совершенно бесшумной, поэтому единственный ответ, который вы получите, - это вывод из whoami.

Преимущество этого метода заключается в том, что вы можете запускать программы через sudo по ssh, которые сами требуют ввода stdin. Это потому, что sudo использует пароль в первой строке стандартного ввода, а затем разрешает любой программе, в которой он работает, продолжать захват стандартного ввода.

Пример 2 - Удаленная команда, которая требует своего собственного стандартного ввода

В следующем примере удаленная команда "cat" выполняется через sudo, и мы предоставляем несколько дополнительных строк через stdin для отображения удаленной кошкой.

$ ssh [email protected] cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Вывод демонстрирует, что строка <remote_sudo_password> используется sudo, и что удаленно выполняемый кот отображает дополнительные строки.

Пример того, где это может быть полезно, - это если вы хотите использовать ssh для передачи пароля привилегированной команде без использования командной строки. Скажем, если вы хотите смонтировать удаленный зашифрованный контейнер поверх ssh.

Пример 3. Монтирование удаленного контейнера VeraCrypt

В этом примере сценария мы удаленно монтируем контейнер VeraCrypt через sudo без дополнительного текста подсказки:

#!/bin/sh
ssh [email protected] cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

Следует отметить, что во всех приведенных выше примерах командной строки (все, кроме скрипта) конструкция << EOF в командной строке будет приводить к записи всего набранного, включая пароль, на локальном компьютере .bash_history, Поэтому настоятельно рекомендуется, чтобы для реального использования вы использовали либо полностью, через скрипт, как в примере с veracrypt выше, либо, если в командной строке, поместили пароль в файл и перенаправили этот файл через ssh.

Пример 1a - Пример 1 без локального пароля командной строки

Таким образом, первым примером станет:

$ cat text_file_with_sudo_password | ssh [email protected] cat \| sudo --prompt="" -S -- whoami
root

Пример 2a - Пример 2 без локального пароля командной строки

и вторым примером станет:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Поместить пароль в отдельный файл не нужно, если вы помещаете все это в сценарий, так как содержимое сценариев не попадает в вашу историю. Тем не менее, это может быть полезно, если вы хотите разрешить пользователям, которые не видят пароль, выполнять скрипт.

Ответ 6

Лучший способ - ssh -t [email protected] "sudo <scriptname>", например ssh -t [email protected] "sudo reboot". Сначала будет запрашиваться пароль для пользователя, а затем root (поскольку мы запускаем script или команду с привилегиями root.

Я надеюсь, что это помогло и очистило ваши сомнения.

Ответ 7

echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey [email protected]$varRemoteHost 
echo \"$varCommand\" | sudo bash

Ответ 8

Я столкнулся с проблемой,

[email protected]$ ssh -q [email protected] sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

Затем я попробовал с

#1
vim /etc/sudoers
Defaults:user1    !requiretty

не работает

#2
user1   ALL=(user2)         NOPASSWD: ALL

это сработало правильно!

Ответ 9

В зависимости от вашего использования у меня был успех со следующим:

ssh [email protected] "script"

Это вызовет пароль root и затем выполнит команду правильно.