Мне нужно запустить сценарий удаленно на нескольких Fedora машины через ssh. Поскольку сценарий требует корень Priviliges, я делаю:
$ ssh me@remost_host "sudo touch test_sudo" #just a simple example
sudo: no tty present and no askpass program specified
Удаленные машины настроены таким образом, что пароль для sudo это никогда попросил о. Для указанной выше ошибки наиболее частым исправлением является выделение псевдотерминала с -t
опция в ssh:
$ ssh -t me@remost_host "sudo touch test_sudo"
sudo: no tty present and no askpass program specified
Попробуем заставить это выделение -t -t
:
$ ssh -t -t me@remost_host "sudo touch test_sudo"
sudo: no tty present and no askpass program specified
Нет, не работает.
В /etc/sudoers
конечно у меня есть такая строчка:
#Defaults requiretty
... но я не могу вручную поменять его на десятках удаленных машин.
Я что-то упустил? Есть простое решение?
РЕДАКТИРОВАТЬ:
ssh me@host "sudo stat ."
работает.РЕДАКТИРОВАТЬ 2: Бег tty
на хосте, где это работает:
$ ssh me@host_ok tty
not a tty
$ ssh -t me@host_ok tty
/dev/pts/12
Connection to host_ok closed.
$ ssh -t -t me@host_ok tty
/dev/pts/12
Connection to host_ok closed.
Теперь на хосте, где это не работает:
$ ssh me@host_ko tty
not a tty
$ ssh -t me@host_ko tty
not a tty
Connection to host_ko closed.
$ ssh -t -t me@host_ko tty
not a tty
Connection to host_ko closed.
РЕДАКТИРОВАТЬ 3 Разрешения на / dev / tty * на машине, на которой вышеперечисленное не работает:
$ stat /dev/tty*
File: `/dev/tty'
Size: 0 Blocks: 0 IO Block: 4096 character special file
Device: fd02h/64770d Inode: 17089401 Links: 1 Device type: 5,0
Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-12-11 11:44:01.000000000 +0000
Modify: 2013-12-11 11:44:01.000000000 +0000
Change: 2014-01-20 15:43:36.000000000 +0000
РЕДАКТИРОВАТЬ 4
Хорошо, так что в /var/log/
Имею следующее:
$ ls /var/log
btmp lastlog maillog messages secure spooler sudo tallylog wtmp yum.log
Я пробовал с messages
и secure
, но они пусты. sudo
с другой стороны, что-то содержит ... единственная проблема в том, что он отображает то же сообщение журнала, использую ли я -t
, -t -t
или ничего:
Jun 4 17:38:52 : my_username : no tty present and no askpass program
specified ; TTY=unknown ; PWD=/home/my_username ; USER=root ;
COMMAND=/usr/bin/stat .
попробуй это:
ssh root@remote_host "sed -ibak s/requiretty/\!requiretty/ /etc/sudoers"
ИЛИ еще лучше это:
echo 'Defaults:me !requiretty' > me
scp me root@remote:/etc/sudoers.d/
ssh me@remote whatever
* одноразовый вход с root-доступом обязательный хотя *
Во-первых, я думаю, что вы, вероятно, неправильно принимаете решение.
Если вы используете десятки удаленных машин и вам нужно делать аналогичные вещи на многих из них, и вы беспокоитесь о том, что не сможете внести изменения конфигурации вручную на них, то похоже, что вам пора заняться управлением конфигурацией. Например, Puppet или Chef - более стандартные варианты. Или, может быть, Ansible, который требует меньше установки на целевые машины. Однако Ansible, скорее всего, столкнется с той же проблемой.
Если вы хотите продолжить свой текущий подход, посмотрите на использование dsh для отправки команды на список машин. Вероятно, это не поможет с проблемой sudo.
Тем не менее ...
Вы говорите, что «удаленные машины настроены таким образом, что пароль для sudo никогда не запрашивается», но похоже, что sudo хочет запросить пароль. Еще раз проверьте, можете ли вы войти на эти машины, затем запустите sudo, и он будет работать нормально без пароля. Если это сработает, проверьте, есть ли что-то другое в среде после входа в систему. Например, запустите 'ssh you @ remotehost env' для хостов, на которых sudo работает и не работает.
Честно говоря, меня больше озадачивает то, как sudo работает там, где вы говорите, а не то, как это работает. Разве вам не следует использовать следующее?
my_account ALL=(ALL) NOPASSWD: ALL
Если не так, то как вы решаете не требовать пароль?
У меня была такая же проблема с запуском команд sudo через агент zabbix. Чтобы решить свою проблему, я сбросил следующий файл в папку sudoers.d
каталог.
# zabbix-specific additions to sudoers file
Cmnd_Alias ZABBIXCMDS = /usr/local/sbin/zabbix_user_*, /usr/local/sbin/zabbix_discovery_*
zabbix ALL=(ALL) NOPASSWD: ZABBIXCMDS
Defaults!ZABBIXCMDS !requiretty
Этот шаблон должен учитывать ваши потребности. Это не специфично для Zabbix, поэтому просто адаптируйте его под свои нужды - здесь есть все необходимое.
Я бы написал сценарий, чтобы делать то, что вам нужно (например, do_stuff.sh
), затем выполните его так:
ssh me@remote_host < do_stuff.sh
Вам может понадобиться ssh -t
там, но это эффективно выполняет do_stuff.sh
скрипт удаленно, не копируя его на удаленные серверы.