Sudo over SSH с передачей пароля, tty не требуется:
Вы можете использовать sudo поверх ssh, не заставляя ssh иметь псевдо-tty (без использования ключа ssh "-t"), указав sudo не требовать интерактивный пароль и просто получить пароль от стандартного ввода. Вы делаете это с помощью переключателя "-S" на sudo. Это заставляет sudo прослушивать пароль на stdin и прекращать прослушивание, когда видит новую строку.
Пример 1 - Простая удаленная команда
В этом примере мы отправляем простую whoami
команду:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
Мы говорим sudo не выдавать приглашение и принимать его от stdin. Это делает пароль sudo абсолютно бесшумным, поэтому единственный ответ, который вы получите, - это вывод whoami
.
Преимущество этого метода заключается в том, что вы можете запускать программы через sudo по ssh, которые сами требуют ввода stdin. Это связано с тем, что sudo использует пароль в первой строке стандартного ввода, а затем разрешает любой программе, которая запускается, продолжать захват стандартного ввода.
Пример 2 - Удаленная команда, которая требует своего собственного стандартного ввода
В следующем примере удаленная команда «cat» выполняется через sudo, и мы предоставляем несколько дополнительных строк через stdin для отображения удаленной кошкой.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Выходные данные демонстрируют, что <remote_sudo_password>
строка используется sudo, и что удаленно выполняемый cat отображает дополнительные строки.
Пример того, где это может быть полезно, - это если вы хотите использовать ssh для передачи пароля привилегированной команде без использования командной строки. Скажем, если вы хотите смонтировать удаленный зашифрованный контейнер поверх ssh.
Пример 3 - Монтирование удаленного контейнера VeraCrypt
В этом примере сценария мы удаленно монтируем контейнер VeraCrypt через sudo без дополнительного текста запроса:
#!/bin/sh
ssh user@server 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 user@server 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
Поместить пароль в отдельный файл не нужно, если вы помещаете все это в сценарий, так как содержимое сценариев не попадает в вашу историю. Тем не менее, это может быть полезно, если вы хотите разрешить пользователям, которые не должны видеть пароль, выполнять скрипт.
ssh <user@server> sudo <script>
, так как я получал ошибкуsudo: no tty present and no askpass program specified