我正在尝试创建一个 shell 脚本来执行一些我经常需要的命令。我使用公钥/私钥对进行 ssh 登录以跳过密码提示。经过一番搜索后,我能够执行一些代码,例如:
文件:ssh.sh
ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c
EOF
但如果我这样写,我看不出有什么区别:
ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c &
EOF
没有&
什么区别。有了&
,一般执行完gedit后,就会发送到后台,出现提示。但我在 gedit 后没有收到提示。 (尽管下一行中的任何内容都会被执行。就像我输入 一样echo "Hello"
,它会显示Hello
。)
这是怎么回事?还有其他方法吗?我想做一个 SSH 并通过 shell 脚本执行一些命令。但我不想在 shell 脚本执行完成后注销。我想在执行一些我自己的命令后手动注销,这些命令不像上面的脚本那样重复。
答案1
如果没有&
,您远程执行的脚本会显示“更改为/root/myDir
,然后执行gedit
并等待它退出”。的变体&
表示不等待gedit
退出。无论哪种方式,shell 在执行脚本中的最后一个命令后都会退出。
如果要执行脚本,然后执行更多交互式键入的命令,则需要在最后执行交互式 shell。
ssh -Xt [email protected] 'cd /root/myDir && gedit a.c b.c; exec bash'
该选项-t
告诉 SSH 在服务器上设置一个虚拟终端;默认情况下,当您传递要执行的远程命令时,它不会执行此操作。exec bash
最后告诉 shell 将自身替换为一个新的 bash 实例,这将是一个交互式 shell(显示提示、监听命令等),因为它的输入来自终端。
答案2
您可以定义 afunction
然后通过 执行它ssh
。
#!/bin/bash
ssh_func(){
cd /root/myDir
gedit a.c b.c
}
ssh -X [email protected] "$(typeset -f); ssh_func"
typeset -f
将显示脚本中定义的函数。