我有以下任务:
- 该命令必须通过 ssh 在 bash 脚本中以 root 身份在服务器上远程运行,并且必须在变量中获取命令输出。
- 以 root 身份登录 ssh 被禁用。
- 服务器上的 sudo 被禁用,所以我必须使用 su。
- 编辑:因为我想在 bash 中使其尽可能自动化,所以密码必须存储在命令中
我已经用谷歌搜索了好几天,但似乎找不到解决方案。
此处提出的解决方案:ssh to server and switch user and change a directory
ssh -t username@hostname "sudo su - otheruser -c \"cd /path/to/directory && command\""
不起作用,因为在服务器上禁用了 sudo:
有人对此有解决方案吗?
通过 SSH 登录(作为非特权用户),然后运行
su
不带任何参数的命令以更改为 root 用户。您将需要 root 密码才能执行此操作。然后运行您想要运行的任何命令。编辑:如果您想在一行中执行此操作,可以使用以下方法:
ssh username@hostname "su -c \"code_here\""
如果这不起作用,请确保通过以 root 身份运行来启用 root 密码
passwd
。这将要求您输入新的 root 密码。额外:以除 root 以外的其他用户身份运行命令(请注意,这需要目标用户的密码):
ssh username@hostname "su - username_of_target -c \"code_here\""
也许有点离题,但这可以通过 Python 和paramiko模块来实现:
应该注意的是,从安全角度来看,将密码存储在脚本中通常是一个坏主意。确保您为脚本设置了适当的权限(例如 chmod 740)
您还可以使用 paramiko 调用 shell 命令进行交互式会话。 https://www.youtube.com/watch?v=lLKdxIu3-A4
与将 root 密码放在脚本中相比,安全噩梦要少一些,您可以使用
setuid
可执行文件。setuid
可执行文件以 root 身份运行,无论哪个用户执行它们。这样做的主要优点是,如果有人偷了你的笔记本电脑,他们可以
smartctl -a /dev/sda
以 root 身份运行,否则只有你的用户权限。甚至更少,如果您使用稍后提到的强制命令设置公钥。编写一个简单的 C 程序,
smartctl_wrapper.c
简单地运行您需要的脚本或程序,如下所示:并将其编译为
gcc smartctl_wrapper.c -o smartctl_wrapper
.然后,您使其属于 root 以及应该能够运行它的组。这些命令应该以 root 身份运行:
然后使其成为
setuid
可执行文件。还要防止任何用户对其进行编辑:现在这是一个可执行文件,可以由
some_group
具有 root 权限的任何成员运行,而无需任何密码。现在您可以简单地使用 ssh 运行它:
如果服务器允许,您可以使用公钥设置 ssh 连接,以允许无需密码的连接。您还可以使用强制命令,这样除了运行这个脚本之外,这个键对任何事情都没有好处。
如果服务器不允许,您可以创建一个包含 ssh 密码的脚本。在这种情况下,我强烈建议您为此创建一个具有最小权限和登录 shell 的新用户
/sbin/nologin
。或者,对于您的特定用例,避免完全以 root 身份运行命令可能更有意义
ssh
。例如,您可以使用cron
. 您可以使用以下命令编辑 root 的 crontab:并添加以下行:
给定的行将在周日午夜后 5 分钟每周运行一次命令。您可以按照crontab(5)中的说明根据自己的喜好进行调整。
然后,您可以使用
ssh
仅阅读日志。所以,经过 4 个小时的额外网络爬取,我终于成功了!非常感谢@jeroen-it-nerdbox 给了我对此的见解:
任务是从 smartctl(需要 root 凭据)、禁用 ssh-root 和禁用 sudo 的服务器获取数据。这当然也适用于 sudo 而不是 su。
这是带有 Paramiko 实现的 Python 中完整的可用代码。
您可以在 bash 中像这样简单地执行此操作:模拟人类与 su 的交互。我在没有 sudo 的服务器的自动远程安装程序上使用它。
亲切的问候,