如何在bash中一起使用ssh和sudo?


10

我没有找到描述此特定情况的问题。

我正在尝试执行一个非常基本的bash脚本,以从多台计算机检索日志记录。我在本地运行脚本,但需要通过ssh访问外部计算机,以及在该计算机上一次将sudo转换为特权用户...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

使用sh -x运行它表明bash卡在了'ssh'行中。所以我尝试将其修改为:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

这似乎也无限期地停滞。有没有更好的解决方案来解决这个问题?据我所知,我看不到使用sudo su的方法...

谢谢你的帮助!


为什么要近距离投票?这个问题的主题是:管理服务器,工作站,存储或网络的硬件或软件,用于管理,监视或自动化这些工具的工具
jlliagre 2014年

Answers:


5

我在当前环境中实现此目标的方法是,使用带有-t强制tty分配的标志的ssh 运行,然后在其中运行sudo -u root,如下所示:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

我的帐户位于远程的sudoers中,因此不需要密码。

此示例显示了在单个ssh会话中执行此操作的不同方法,包括使用bash或在子shell中运行多个命令。还要注意,如果将上述代码放入可执行脚本中,则可以将命令行参数($ 1和$ 2)传递给ssh,它们将被扩展,然后在远程引用。


不幸的是,因为我不管理远程服务器,所以我相信这里使用sudo su是困难的。仍然可以这种格式工作吗?
Matt124234 2014年

是的,它也会工作。您可以在出现提示时输入密码。
Michael Martinez

我已经尝试过:ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su-adcentrl egrep'ERROR \ | WARN'/ home / adcentrl / cronjobs / logs / * / * EOF但是我收到了:“ Pseudo -stterminal不是终端,因此不会分配-terminal。”
Matt124234 2014年

完全可以。忽略该警告并继续。如果愿意,可以在远端的/ etc / sudoers中禁用“ RequireTty”
Michael Martinez

5

如果您不希望或无法阻止sudo询问您的密码,一个简单的技巧是在本地读取它并将其存储在本地变量中:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

1

如果将sudo配置为允许无密码命令,则应执行所需的操作:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

要么

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

取决于要file.txt在本地还是远程创建文件。

否则,这是将远程用户的密码传递给的一种方法sudo

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

很有意思。但是,使用不带-t的ssh会告诉我“不存在tty”。在-t中添加可消除此错误,但似乎不接受'sudo su',因为它会提示我输入密码。这就是我正在做的事情:ssh -t mrhyner@test-server.net“ sudo su-adcentrl -c egrep” ERROR \ | WARN“ / home / adcentrl / cronjobs / logs / * / *”这给了我:bash :警告:找不到命令mrhyner的[sudo]密码:
Matt124234

抱歉,我显然不知道该如何格式化我的评论
Matt124234 2014年

我假设sudo被配置为您的远程帐户无密码。
jlliagre 2014年

并且您缺少额外的单引号。
jlliagre 2014年

是的,这使我断定bash由于某种原因没有遵守ssh命令。它的行为就像我正在尝试从本地主机sudo = \
Matt124234 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.