我必须通过ssh在多个Fedora机器上远程运行脚本。 由于脚本需要root权限 ,我可以这样做:
$ ssh me@remost_host "sudo touch test_sudo" #just a simple example sudo: no tty present and no askpass program specified
远程计算机的configuration方式使得sudo的密码 永远不会被要求。 对于上述错误,最常见的解决方法是在ssh中用-t选项分配一个伪terminal。
$ 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 ."的sudoers文件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
*一次login瓦特/根需要虽然*
我会写一个脚本来做你所需要的(例如do_stuff.sh ),然后执行它:
ssh me@remote_host < do_stuff.sh
您可能需要一个ssh -t ,但是这样可以有效地执行do_stuff.sh脚本,而不需要将其复制到远程服务器上。
我有同样的问题通过zabbix代理运行sudo命令。 为了解决我的问题,我把下面的文件放到了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,只是适应你的使用 – 所有的作品都在这里。
首先,我认为你可能是以错误的方式处理事情。
如果你正在运行数十台远程机器,并且需要在其中的大部分上做类似的事情,而且担心无法手动对其进行configuration更改,那么现在是时候让你开始使用configurationpipe理了。 例如木偶或厨师是更标准的select。 或者也许Ansible,在目标机器上安装较less。 Ansible最有可能遇到同样的问题。
如果您想继续使用当前的方法,请查看使用dsh将命令发送到机器列表。 虽然可能不会帮助sudo问题。
那说…
你说:“远程机器被configuration为sudo的密码永远不会被要求”,但它确实看起来像sudo想要求一个密码。 再次检查是否可以login到这些机器,然后运行sudo,并且运行正常,没有密码。 如果可行,那么在login后检查环境中是否有不同的东西。例如,运行“ssh you @ remotehost env”来对付sudo不能运行的主机。
说实话,我更厌倦了sudo是如何工作的,而不是它如何失败。 你不应该使用以下吗?
my_account ALL=(ALL) NOPASSWD: ALL
如果不是那样的话,那你怎么安排不要密码?