Вопрос по ssh, sudo – правильный способ sudo над ssh

116

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

<code>ssh [email protected] "sudo script"
</code>

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

что касается меня, причина искать способ sudoing через ssh заключалась в том, что он не работал при попытке что-то вродеssh <[email protected]> sudo <script>, как я получаю ошибкуsudo: no tty present and no askpass program specified knocte

Ваш Ответ

8   ответов
-5

ssh [email protected] "script"

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

Помните, что ssh - это не telnet. Нет ничего более опасного для ssh от имени root, чем для ssh от имени другого пользователя и запускающего sudo. Ваш пароль зашифрован таким же образом через соединение ssh.
St & # xE9; phane абсолютно верен с точки зрения безопасности пароля. Однако, используя root вместо sudo, вы теряете контрольный журнал, который идет с sudo. Кроме того, root-доступ может быть недоступен.
Yikes, SSH как root? Это плохая идея по разным причинам. darkfeline
6

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

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

no password prompt won't show password in remote machine bash history
Он будет отображаться в истории bash локальной системы, включая пароль. Лучше хранить пароль в файле и катать файл.
Человек, я знал о-t, но я не прочитал руководство достаточно внимательно, чтобы увидеть, что вы можете пройти его дважды! Это то, что я искалmonths! В качестве дополнения безопасности я просто устанавливаю переменную пароля перед запускомread -s -p "Password: " pwзатем сделалecho "$pw" | ...., Сейчас я свернул это в удобный для меня сценарий :).
0

[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

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

1

NOPASS в конфигурации на вашей целевой машине это решение. Продолжить чтение наhttp://maestric.com/doc/unix/ubuntu_sudo_without_password

В этом случае я действительно хочу пароль и введите его напрямую, так что это не работает для меня. darkfeline
0

Лучший способ этоssh -t [email protected] "sudo <scriptname>", напримерssh -t [email protected] "sudo reboot". It will prompt for password for user first and then root(since we are running the script or command with root privilege.

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

196

-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.
@ Винс смотриgo2linux.garron.me/linux/2010/11/…
для чего нужна опция -t?
Это не работает здесь:ssh -t localhost <<< "sudo touch file;" РЕДАКТИРОВАТЬ Очевидно, что вы действительно предоставляете команду в качестве параметра, а не через стандартное (что имеет смысл задним числом).
-t Метод также покажет цветной вывод команд, которые обычно делают это.
Хорошо, я знал об опции -t, просто не знал, что она работает для приглашений sudo.
1

Sudo over SSH passing a password, no tty required:

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

Example 1 - Simple Remote Command

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

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

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

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

Example 2 - Remote Command That Requires Its Own stdin

В следующем примере удаленная команда «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.

Example 3 - Mounting a Remote VeraCrypt Container

В этом примере сценария мы удаленно монтируем контейнер 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 Конструкция в командной строке приведет к тому, что все напечатанное, включая пароль, будет записано вlocal .bash_history. Поэтому настоятельно рекомендуется, чтобы для реального использования вы использовали либо полностью, с помощью сценария, как в примере с veracrypt выше, либо, если в командной строке, поместили пароль в файл и перенаправили этот файл через ssh.

Example 1a - Example 1 Without Local Command-Line Password

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

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

Example 2a - Example 2 Without Local Command-Line Password

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

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

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

7

Assuming you want no password prompt:

Example

ssh [email protected] 'echo secret | sudo -S echo hi' # outputs 'hi'
Не говоря уже о введении вашего пароля (в виде открытого текста) в файл bash_history.
Это / очень / опасно, так как незашифрованный пароль заканчивается в командной строке. Командные строки являются общедоступными и могут быть просмотрены любым другим пользователем и процессом в системе. Например, "ps auxwwwww" непривилегированным пользователем покажетevery процесс запущен и командные строки которые их запускали.

Похожие вопросы