使用 PermitRootLogin=no 通过 ssh 管理服务器

使用 PermitRootLogin=no 通过 ssh 管理服务器

如果我无法以 root 身份通过 ssh 访问我的每台服务器,我该如何有效地进行修改?

我无法设置 ssh 密钥或使用 NOPASSWD 打开 sudoers 文件。我无法安装 puppet 或 spacewalk。

有时当我尝试在脚本中包含 sudo 命令时,我会收到错误“没有 tty 存在”。有人在这样的环境中工作过吗?

答案1

su root一旦进入服务器,您就可以随时以普通用户身份登录,也可以以根用户身份登录。

答案2

通过这些特定的限制,您可以使用交换机强制 tty 分配-t到 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,但它可以工作,您只需输入您的密码。

答案3

由于您提到您不能使用公钥身份验证,并且必须输入密码才能通过初始登录提示 - 您最好的选择可能是 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 并提供相同的用户密码。它还为您提供了一个框架来执行您自己的动态配置。

此外——没有 tty 是因为您没有在脚本中打开 tty,因为它们通常以非交互方式运行。

答案4

使用分布式 shell劉貽牧師或者德士

不能直接以 root 身份登录真的是个问题吗?

我总是以普通用户身份登录,并且仅使用 sudo 运行管理命令。

我承认没有集中控制是一个问题,特别是当你需要在多台服务器上执行更改时,但你可以在 Linux 桌面计算机上使用 mssh 或 dsh 之类的程序在每台服务器上运行相同的命令。

连接到四台服务器并运行路由命令所需的步骤示例如下

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

  • 如果你没有设置密钥,请输入你的密码

  • 运行 sudo“命令”

  • 再次输入您的密码

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

然后步骤就变得简单了

  • 使用 mssh 连接到组或服务器,例如“webservers”

  • 运行 sudo“命令”

  • 输入您的密码。

关于我使用 mssh 的更多信息请点击此处

相关内容