我发现自己需要登录各种服务器,设置环境变量,然后以交互方式工作。
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到另一台机器,运行一些命令,然后继续,就好像我手动运行它们一样?”
答案 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"