这是我的脚本中的命令:
ssh -i $KEY $USER@$HOST "sudo su tom; echo $DATA >> /home/user/file.txt
这些命令单独使用时效果很好,但在脚本中一起使用时就会挂起。
如果你单独运行这个命令,sudo su tom; cat /home/user/file.txt
它只会在你注销用户 tom 时执行 cat。
如何更改用户并在 bash 脚本中执行命令?
答案1
除了 Paul Calabro 建议的内容(我认为这不是您的主要问题)之外,您还应该定义用于在远程计算机上执行命令的命令行解释器(shell),因为可能有与本地主机不同的 shell 。
我想你还需要命令-t
的参数ssh
:
-t 强制伪 tty 分配。这可用于在远程计算机上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty。
以下内容应该更接近您正在寻找的内容:
ssh -it $KEY $USER@$HOST 'sudo su tom; echo $DATA >> /home/user/file.txt; bash'
不幸的是,在上面的解决方案中,sudo su
&&的“concat”echo
仍然不起作用,但是使用命令-c
参数su
应该修复
-c, --command=COMMAND 使用 -c 将单个 COMMAND 传递到 shell
答案2
这是您指定的命令:
ssh -i $KEY $USER@$HOST "sudo su tom; echo $DATA >> /home/user/file.txt
关于此的一些小注意事项:
- 如果
$KEY
或$USER
或$HOST
包含空格,该命令将产生意外的行为。 (不太可能。) $DATA
在您运行命令的主机上展开ssh
,而不是在您远程登录的主机上展开。 (我假设这就是您的意图。)"
您的命令末尾缺少结束语。我假设这是一个复制粘贴错误。
现在关于这个命令的要点,以及解决您的问题的命令:
sudo
不仅仅用于将命令运行为root
. 它是用于的,我引用手册页:
sudo, sudoedit - execute a command as another user
所以,你想要的简单命令是:
ssh -i $KEY $USER@$HOST "sudo -u tom echo $DATA >> /home/user/file.txt"
这假设$USER
具有写入权限/home/user/file.txt
。如果只有tom
拥有这些权限的人,则使用:
ssh -i $KEY $USER@$HOST "sudo -u tom -i 'echo $DATA >> /home/user/file.txt'"
有关更多信息,请阅读man sudo
.
答案3
我无法切换用户,以 root 身份执行似乎可以解决问题。
ssh -i $KEY $USER@$HOST "echo "$DATA" |sudo tee $DIRECTORY"