关于shell:我可以在某个地方运行ssh,运行一些命令,然后给自己留下一个提示吗?

Can I ssh somewhere, run some commands, and then leave myself a prompt?

我发现自己需要登录到各种服务器,设置环境变量,然后以交互方式工作。

例如

1
2
3
4
5
$ ssh anvil
jla@anvil$ export V=hello
jla@anvil$ export W=world
jla@anvil$ echo $V $W
hello world

如何组合前几个命令,然后在提示下离开自己?

类似:

1
2
3
$ ssh anvil --on-login 'export V=hello; export W=world;'
jla@anvil$ echo $V $W
hello world

显然这是一个模型问题。我真正要问的是,"我应该如何对不同的机器进行ssh,运行一些命令,然后像手动一样继续运行它们?"


最简单的可能是:

1
$ ssh -t host 'cmd1; cmd2; sh -i'

如果要设置变量,请执行以下操作:

1
$ ssh -t host 'cmd1; cmd2; FOO=hello sh -i'

请注意,这是一个糟糕的黑客程序,您最好将所需的初始命令放入脚本并执行以下操作:

1
2
3
$ scp setup host:~
$ ssh host
host$ . setup


您还可以使用以下Expect脚本:

1
2
3
4
5
6
7
8
9
#!/usr/bin/expect -f
spawn ssh $argv
send"export V=hello
"
send"export W=world
"
send"echo \$V \$W
"
interact


结果这是由这个问题回答的:

如何直接对特定目录执行ssh?

对SSH:

1
ssh -t anvil"export V=hello; export W=world; bash"

然后:

1
2
jla@anvil$ echo $V $W
hello world

值得注意的是,ssh -t实际上可用于通过另一台主机连接到一台主机。

因此,例如,如果要在砧上执行命令,但砧只能从主机网关(通过防火墙等)访问,可以这样做:

1
ssh gateway -t 'ssh anvil -t"export V=hello; export W=world;bash -l";'

退出铁砧,也会让你退出网关(如果你想在离开铁砧后留在加特威,而不是在关闭命令前添加另一个bash -l


另一种方法是执行这个野兽(也给了我一个彩色外壳):

ssh host -t"echo 'rm /tmp/initfile; source ~/.bashrc; cd foo/; git status' > /tmp/initfile; bash --init-file /tmp/initfile"