使用PermitRootLogin = no通过sshpipe理服务器

如果我不能以root身份login到每台服务器,我怎样才能以有效的方式进行修改?

我不允许使用NOPASSWD设置ssh密钥或打开sudoers文件。 我不能安装木偶或太空行走。

有时当我尝试在脚本中包含一个sudo命令时,会出现“没有tty存在”的错误。 有没有人在这样的环境下工作?

您可以随时以普通用户身份login,并且一旦进入服务器,就可以root用户身份login到root用户。

有了这些特定的限制,你可以使用-t开关强制tty分配到ssh:

 $ ssh server1 'sudo echo foo' sudo: sorry, you must have a tty to run sudo $ ssh -t server1 'sudo echo foo' foo Connection to server1 closed. 

在这个例子中,它是nopasswd,但它会工作,你只需要input你的密码。

既然你提到你不能使用公钥authentication,并且必须input一个密码才能通过初始login提示 – 你最好的select可能是Python(或Perl)和Expect的组合:

 #!/usr/bin/python import pexpect USER = 'myuser' PASS = 'mypwd' HOST = 'myhost' CMD = 'ssh -l %s %s' % (USER, HOST) conn = pexpect.spawn(CMD) conn.expect('password:') conn.sendline(PASS) # do the rest of your stuff here ... 

这应该足以作为一个起点 – 有很多关于这个主题的教程(和SO问题)。 例如,您可以“su – ”或sudo并提供相同的用户密码。 它给你一个框架来做你自己的dynamicconfiguration。

另外 – 没有tty礼物是因为你没有在脚本中打开一个tty,因为它们通常非交互式运行。

no tty present. 意味着你的sudoers文件包含Defaults requiretty 。 如果你发表评论,它会消失。

我会考虑你的pipe理,但听起来你不能安装任何东西。 在这种情况下,准备好input你的密码很多:((或,糟糕的主意,因为它是脚本的东西,把你的密码到正确的地方与期望…)

另外, sudo -l会给你一个真正的root shell。 这对于交互式pipe理很有用,但对于自动化的东西并不那么重要。

使用像mssh或dsh这样的分布式shell

是否真的不能以root身份直接login?

我总是以普通用户身份login,只能使用sudo来运行pipe理命令。

我接受这是一个没有集中控制的问题,尤其是当你需要在多个服务器上执行更改时,但是你可以使用Linux桌面机器中的mssh或dsh之类的东西在每台服务器上运行相同的命令。

连接到四台服务器并以路由方式运行一个命令所需的步骤的一个例子是

  • 使用mssh连接到所有四台服务器(例如mssh host1 host2 host3 host4)

  • 如果您没有设置密钥,请input您的密码

  • 运行sudo“命令”

  • 再次input您的密码

当然,您可以为自己的常规用户帐户设置密钥。 你也可以在mssh中为服务器组设置别名。

然后这些步骤变得微不足道

  • 使用mssh连接到一个或多个服务器,如“web服务器”

  • 运行sudo“命令”

  • input您的密码。

这里有更多关于我使用mssh的信息

你正在尝试交互式工作,还是通过脚本?

这些政策听起来像一个大公司或政府的东西。 如果是这样的话,只需要有人为像IBM / Tivoli这样的pipe理解决scheme支付几百万美元。