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

Mat*_*234 10 linux bash

我一直无法找到描述此特定场景的问题。

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

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt
Run Code Online (Sandbox Code Playgroud)

使用 sh -x 运行它会显示 bash 卡在“ssh”行上。所以我尝试将其修改为:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

Mic*_*nez 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
Run Code Online (Sandbox Code Playgroud)

我在远程端的 sudoers 中有我的帐户,因此不需要密码。

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


小智 5

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

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
Run Code Online (Sandbox Code Playgroud)