如何在 bash 中同时使用 ssh 和 sudo?

如何在 bash 中同时使用 ssh 和 sudo?

我还找不到描述这一特定场景的问题。

我正在尝试执行一个非常基本的 bash 脚本来从多台机器检索日志。我在本地运行该脚本,但需要通过 ssh 访问外部机器,并在该机器上使用 sudo 访问特权用户...

ssh [email protected]
sudo su  - privledged_user
cat logs > file.txt

使用 sh -x 运行此命令时,发现 bash 卡在了 'ssh' 行。因此我尝试将其修改为:

ssh [email protected] sudo su - privledged_user cat logs > file.txt

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

谢谢你的帮助!

答案1

我在当前环境中实现此目的的方法是使用-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,这些参数将被扩展并在远程端引用。

答案2

如果你不想或者无法阻止 sudo 询问你密码,一个简单的技巧就是在本地阅读并将其存储在局部变量中:

read -p 'Password: ' -s password

ssh -t [email protected] <<EOF
  echo "$password" | sudo -S whoami
EOF

答案3

如果 sudo 配置为允许无密码命令,则这应该可以执行您想要的操作:

ssh [email protected] "sudo su - privileged_user -c 'cat logs'" > file.txt

或者

ssh [email protected] "sudo su - privileged_user -c 'cat logs > file.txt'"

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

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

echo mrhyner_password | \
  ssh [email protected] \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

相关内容