我一直无法find描述这个特定场景的问题。
我正在尝试执行一个非常基本的bash脚本来从多台机器检索日志logging。 我在本地运行脚本,但需要通过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从我可以告诉…
谢谢你的帮助!
我在当前环境中实现这一点的方法是使用强制tty分配的-t标志运行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询问你的密码,一个简单的技巧就是在本地读取它并将其存储在本地variables中:
read -p 'Password: ' -s password ssh -t [email protected] <<EOF echo "$password" | sudo -S whoami EOF
如果sudoconfiguration为允许无密码的命令,这应该做你想要的:
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文件在本地或远程创build。
否则,以下是将远程用户密码传递给sudo一种方法:
echo mrhyner_password | \ ssh [email protected] \ "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"