Fedora、ssh 和 sudo

Fedora、ssh 和 sudo

我必须在多个服务器上远程运行脚本Fedora机器通过远程控制. 由于脚本需要特权,我愿意:

$ ssh me@remost_host "sudo touch test_sudo" #just a simple example
sudo: no tty present and no askpass program specified

远程计算机的配置方式如下:密码对于 sudo 来说绝不要求。对于上述错误,最常见的修复方法是使用-tssh 中的选项分配一个伪终端:

$ 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

...但我不能手动在数十台远程机器上进行更改。

我是不是漏掉了什么?有简单的解决办法吗?

编辑:

  • 这里是工作主机的 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 .

答案1

尝试这个:

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 进行一次性登录必需的尽管 *

答案2

我会编写一个脚本来执行您需要的操作(例如do_stuff.sh),然后像这样执行它:

ssh me@remote_host < do_stuff.sh

您可能需要ssh -t在那里,但这可以有效地do_stuff.sh远程执行脚本,而无需实际将其复制到远程服务器。

答案3

我在通过 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,因此只需根据您的用途进行调整即可 - 所有部分都在这里。

答案4

首先,我认为你可能用错误的方式处理事情。

  • 如果您正在运行数十台远程机器,并且需要在其中许多机器上执行类似操作,并且担心无法手动更改配置,那么听起来是时候开始使用配置管理了。例如,Puppet 或 Chef 是更标准的选择。或者可能是 Ansible,它在目标机器上需要安装的较少。不过,Ansible 最有可能遇到同样的问题。

  • 如果您想继续使用当前方法,请考虑使用 dsh 将命令发送到机器列表。但可能对 sudo 问题没有帮助。

话虽如此...

您说“远程计算机的配置方式是永远不会要求输入 sudo 的密码”,但 sudo 似乎确实想要要求输入密码。再次检查您是否可以登录这些计算机,然后运行 ​​sudo,它运行正常,无需密码。如果可行,则检查登录后环境中是否有不同之处。例如,针对 sudo 可行和不可行主机运行“ssh you@remotehost env”。

说实话,我对 sudo 如何在你说的地方工作比它如何失败更感到困惑。你不应该使用以下命令吗?

my_account ALL=(ALL) NOPASSWD: ALL

如果不是这样,那么您如何安排不需要密码?

相关内容