Ответ 1
Есть два способа избавиться от этого сообщения об ошибке. Простым способом является предоставление псевдотерминала для удаленного sudo-процесса. Вы можете сделать это с помощью опции -t
:
ssh -t [email protected] 'sudo echo "foobar"'
Я пытаюсь войти в ssh-сервер и выполнить что-то вроде:
ssh [email protected] 'sudo echo "foobar"'
К сожалению, я получаю сообщение об ошибке:
sudo: no tty present and no askpass program specified
Google попросил меня либо установить переменную среды SSH_ASKPASS
, либо установить askpass
в файле sudoers
. Моя удаленная машина работает на Debian 6, и я установил пакеты ssh-askpass и ssh-askpass-gnome, а мой файл sudoers
выглядит следующим образом:
Defaults env_reset
Defaults askpass=/usr/bin/ssh-askpass
# User privilege specification
root ALL=(ALL) ALL
user ALL=(ALL) ALL
Может кто-то сказать, что я делаю неправильно, и как это сделать лучше.
Есть два способа избавиться от этого сообщения об ошибке. Простым способом является предоставление псевдотерминала для удаленного sudo-процесса. Вы можете сделать это с помощью опции -t
:
ssh -t [email protected] 'sudo echo "foobar"'
Вместо того, чтобы выделять TTY или устанавливать пароль, который можно увидеть в командной строке, сделайте что-то вроде этого.
Создайте файл оболочки, который выдает ваш пароль следующим образом:
#!/bin/bash
echo "mypassword"
затем скопируйте его в node, который вы хотите использовать scp
следующим образом:
scp SudoPass.sh somesystem:~/bin
Затем, когда вы ssh
выполните следующее:
ssh somesystem "export SUDO_ASKPASS=~/bin/SudoPass.sh;sudo -A command -parameter"
Другой способ - запустить sudo -S
, чтобы "написать запрос стандартной ошибке и прочитать пароль со стандартного ввода вместо использования терминального устройства" (в соответствии с man
) вместе с cat
:
cat | ssh [email protected] 'sudo -S echo "foobar"'
Просто введите пароль при запросе.
Одно из преимуществ заключается в том, что вы можете перенаправить вывод удаленной команды в файл без "[sudo] password for..." в нем:
cat | ssh [email protected] 'sudo -S tar c --one-file-system /' > backup.tar
EDIT Декабрь 2013: Здесь более короткий ответ: найдите день или два, чтобы ознакомиться с библиотекой Python "" Fabric". Fabric решает массу проблем, связанных с отправкой удаленных задач на один или несколько серверов.
Вы, вероятно, по-прежнему хотите настроить имя пользователя в целевой системе, которая может выполнять команды без пароля (и вы также можете использовать Fabric)!
Просто будьте осторожны, что некоторые аспекты Fabric не совсем Pythonic. Кроме того, Fabric был разработан сначала с учетом системных администраторов, людей, которые хотят командовать командами против серверов. Если вы пытаетесь сделать что-то еще (например, автоматизировать некоторые специфические серверы или сценарии), вам нужно будет полностью понять, как работает "с настройками" и/или декоратор @roles. Я не оглядывался назад...
(И да, я получил удаленные SSH-команды, работающие в системах "remote". То есть сервер A запрашивает сервер B для подключения к серверу C, а возвращение команды видно на сервере A, хотя A не поговорите непосредственно с сервером C. Делает лабораторную настройку проще!).
Оригинальный ответ: Есть много решений этой проблемы. Лошади для курсов; некоторые из них лучше других в разных ситуациях.
Вопрос заключается в том, как разрешить ошибку "нет TTY". Это, кажется, является фокусом, поэтому я предполагаю, что разговоры о sudoers - это просто попытка обходного пути, чтобы избежать проблемы TTY.
Вариант 1) Ответ Асхата отлично работает... большую часть времени. На самом деле всегда указывайте "-tt", который работает в более целевых системах.
Обратите внимание, что вы все равно столкнетесь с проблемой, если используете SSH-библиотеку, такую как Paramiko, у которой нет интуитивного способа делать "-t".
Вариант 2) Мой ответ - это указать ASKPASS, который является STDIN. Таким образом, этот пример удовлетворяет как требованиям пароля sudo, так и TTY: $ shell > ssh [email protected] 'echo "password" | sudo -S echo "foobar" '
Вариант 3) Да, вы можете отключить проверку пароля sudo для всех или некоторых пользователей, но это не здорово на производственном сервере.
Вариант 4) Вы можете удалять "requiretty" (или устанавливать "! requiretty" для всех или некоторых пользователей в sudoers. Опять же, не охлаждайте в производственной коробке.
Лучше всего избегать внесения изменений в сервер. Когда-нибудь этот сервер будет заменен, настройки вернутся к умолчанию, а ваш script перестанет работать.
Обратите внимание, что как только вы поймете все свои варианты, он откроет двери для большей автоматизации (например, script на вашем ноутбуке, чем может подключиться к списку имен хостов сервера и выполнить задачи sudo на этих серверах без вам нужно скопировать указанные скрипты на эти серверы).
Как добавить это в файл sudoers:
user ALL=(ALL) NOPASSWD: ALL