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

时间:2012-02-15 21:44:12

标签: shell ssh

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

e.g。

$ ssh anvil
jla@anvil$ export V=hello
jla@anvil$ export W=world
jla@anvil$ echo $V $W
hello world

如何组合前几个命令,然后让自己处于提示状态?

类似的东西:

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

显然这是一个模型问题。我真正要问的是“我如何ssh到另一台机器,运行一些命令,然后继续,就好像我手动运行它们一样?”

5 个答案:

答案 0 :(得分:29)

可能最简单的事情是:

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

如果要设置变量,请执行:

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

请注意,这是一个可怕的黑客攻击,你最好把你想要的初始命令放在脚本中并做:

$ scp setup host:~
$ ssh host
host$ . setup

答案 1 :(得分:14)

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

#!/usr/bin/expect -f
spawn ssh $argv
send "export V=hello\n"
send "export W=world\n"
send "echo \$V \$W\n"
interact

答案 2 :(得分:4)

原来这个问题得到了回答:

How can I ssh directly to a particular directory?

到ssh:

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

接下来是:

jla@anvil$ echo $V $W
hello world

答案 3 :(得分:3)

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

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

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

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

答案 4 :(得分:0)

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

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