Fedora,ssh和sudo

我必须通过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 ." 作品。
  • 这里是主机的sudoers文件,它不起作用。

编辑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 

我尝试了messagessecure ,但他们是空的。 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 

如果不是那样的话,那你怎么安排不要密码?