我还找不到描述这一特定场景的问题。
我正在尝试执行一个非常基本的 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/*/*'"