SSH: выполнить команду sudo


45

У меня есть интерактивный сценарий оболочки, который в одном месте должен подключиться по ssh к другому компьютеру (на основе Ubuntu) и выполнить что-либо от имени пользователя root (пользователь должен ввести свой пароль, но удаленная команда должна выполняться так, как указано в сценарии):

# ...
ssh remote-machine 'sudo ls'
# ...

Тем не менее, я всегда получаю это сообщение об ошибке:

sudo: no tty present and no askpass program specified

ОК, это совершенно ясно. Но как я могу обойти это? Нечто подобное должно произойти:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

Ответы:


52

У чудесного sshесть лекарство от всего. Смысл в том, чтобы добавить -tфлаг, чтобы ssh выделил псевдо-tty:

ssh -t remote-server 'sudo ls'

1
Однако, PTY могут испортить сценарий. lsвывод будет содержать \ r \ n окончания, например.
Тобу

1
Самый простой способ - перевести ls в нетерминальный режим. ls | catбудет делать - он увидит, что стандартный вывод - это труба. В этом конкретном вопросе это не актуально, так как он, очевидно, предназначен для интерактивного запуска из терминала - поэтому вам, вероятно, нужны столбцы, цвета и все такое.
Гейб

0

Этот метод будет запускать один скрипт с использованием sudo после ssh:

Давайте предположим, что у нас есть «удаленный» пользователь с возможностями sudo, и у нас есть скрипт, который мы хотим, чтобы он выполнялся от имени пользователя root.

1) Установите скрипт в / etc / passwd, который будет использоваться при входе в систему:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) Внутри «login.sh» мы выполняем скрипт, который хотим запустить как «sudo»:

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Обычно он спрашивает пароль дважды: ssh login + sudo. Если вы хотите ввести его только один раз, попробуйте sudo без пароля (не рекомендуется). <- пожалуйста, прочитайте комментарий Болдевина.

Основным преимуществом является то, что «ssh» не требует никаких других параметров (например, -t), а sudo принудительно устанавливается на стороне сервера. Кроме того, после выхода из сценария пользователь также выходит из системы.

Это может быть не так элегантно, но это просто и работает.


Ооо Поместить вашего удаленного пользователя в sudoersфайл на сервере, как это, - катастрофа, ожидающая своего появления. Если кто-то получает доступ от имени вашего пользователя (например, через веб-сервер), он может немедленно стать пользователем root. Спасибо, но я искал решения, которые не ставили бы мои настройки сервера в шансы. Если бы у вас было решение, которое каким-то волшебным образом повторно использует аутентификацию из SSH для sudoкоманды, я был бы более заинтересован (и, возможно, начал бы искать замены для SSH ...).
Болдевин

@Boldewyn: да, установка «sudo без пароля» сопряжена с такой угрозой безопасности ... это необязательный шаг. Я согласен с вами, если SSH сможет повторно использовать аутентификацию, такого рода «решения» не потребуются. Спасибо за ваш комментарий.
Лепе

-1

Вы можете выполнить следующую команду получить root-доступ без интерактивности:

ssh server " sudo command" < sudopassword.txt

1
Это не будет работать, потому что stdin не будет терминальным устройством (он будет читать из указанного файла).
Энтони Дж. - справедливость для Моники
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.