Назад | Перейти на главную страницу

Fedora, ssh и sudo

Мне нужно запустить сценарий удаленно на нескольких 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

... но я не могу вручную поменять его на десятках удаленных машин.

Я что-то упустил? Есть простое решение?

РЕДАКТИРОВАТЬ:

РЕДАКТИРОВАТЬ 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 скрипт удаленно, не копируя его на удаленные серверы.