SSH: виконати команду sudo


44

У мене є інтерактивний скрипт оболонки, який в одному місці повинен перейти на іншу машину (на базі 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зробить - побачить, що stdout - це труба. У цьому конкретному питанні це не актуально, оскільки це, мабуть, призначене для інтерактивного запуску з терміналу - тому, напевно, ви хочете, щоб стовпці та кольори та інше.
Гейб

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. Якщо ви хочете ввести його лише один раз, спробуйте судо без пароля (не рекомендується). <- будь ласка, прочитайте коментар Болдевіна.

Основна перевага полягає в тому, що "ssh" не вимагає жодного іншого параметра (як -t), а sudo вимушений на стороні сервера. Крім того, після закінчення сценарію користувач також виходить із системи.

Це може бути не так елегантно, але його просто і працює.


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

@Boldewyn: так, якщо встановити "sudo без пароля", це ризик для безпеки ... його необов'язковий крок. Я згоден з вами, якщо SSH зможе повторно використовувати автентифікацію, подібні "рішення" не потрібні. Дякуємо за ваш коментар
lepe

-1

Ви можете запустити наступну команду отримати кореневий доступ без інтерактивності:

ssh server " sudo command" < sudopassword.txt

1
Це не спрацює, оскільки stdin не буде термінальним пристроєм (він буде читатись із вказаного файлу).
Ентоні Г - справедливість для Моніки
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.