38

I find myself needing to log into various servers, set environment variables, and then work interactively.

e.g.

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

How can I combine the first few commands, and then leave myself at a prompt?

Something like:

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

Obviously this is a model problem. What I am really asking is 'how do I ssh to a different machine, run some commands, and then continue as if I'd run them by hand?'

John Lawrence Aspden
  • 16,583
  • 11
  • 63
  • 104

5 Answers5

32

Probably the simplest thing is:

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

If you want to set variables, do:

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

Note that this is a terrible hack, and you would be much better off putting your desired initial commands in a script and doing:

$ scp setup host:~
$ ssh host
host$ . setup
William Pursell
  • 190,037
  • 45
  • 260
  • 285
16

You could also use the following expect script:

#!/usr/bin/expect -f
spawn ssh $argv
send "export V=hello\n"
send "export W=world\n"
send "echo \$V \$W\n"
interact
jcollado
  • 37,681
  • 8
  • 99
  • 131
4

Turns out this is answered by this question:

How can I ssh directly to a particular directory?

to ssh:

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

followed by:

jla@anvil$ echo $V $W
hello world
Community
  • 1
  • 1
John Lawrence Aspden
  • 16,583
  • 11
  • 63
  • 104
3

It is worth to note that ssh -t can actually be used to connect to one host via another host.

So for example if you want to execute a command on anvil, but anvil is only accessible from host gateway (by firewall etc.), you can do like this:

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

Exiting the anvil, will also log you out of gateway (if you want to stay on gatway after leaving anvil than just add another bash -l before closing the command.

walkeros
  • 4,225
  • 4
  • 30
  • 44
0

Another approach is to execute this beast (also gives me a colored shell):

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

David Vielhuber
  • 2,602
  • 3
  • 27
  • 31