Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Unable to retrieve the profile variable using ssh.

server2 ==> user apptst ==> bash profile has $APPHOME variable.

Was trying to retrieve the value from server1 using ssh but failed.

Used options below

server1> ssh apptst@server2 'echo $APPHOME'

server1> ssh apptst@server2 echo '$APPHOME'

server1> ssh apptst@server2 echo "$APPHOME"

server1> ssh apptst@server2 "echo $APPHOME"

when tried

server1> ssh apptst@server2 ls -ld $APPHOME

it works fine.

Any suggestions what is missing and how can I get the variable from server2?

share|improve this question
    
In the second case the shell on server1 expands $APPHOME, and not server2. Check e.g. with cd / && ssh apptst@server2 'echo $PWD' (you need these quotes ', otherwise again shell on server1 will expand), which will return / and not ~. –  mpy Mar 15 '13 at 13:19
    
Hi Thanks for the explanation. But all the cases have failed to provide the output. confused completely what mistake I am doing. –  KumarJohn Mar 15 '13 at 14:37

2 Answers 2

up vote 4 down vote accepted

This command should work:

 server1> ssh apptst@server2 'bash -l -c "echo \$APPHOME"'
  • you need ' quotes to pass that complete command to ssh as one argument; this also prevents the shell on server1 to expand $APPHOME itself
  • bash -l starts a login shell, which reads in the profiles files, where $APPHOME gets defined (as @chepner pointed out in his answer, this is not default when invoked by sshd)
  • -c executes the next argument, again with quotes that the complete echo command gets executed.
  • escaping \$ is necessary, because otherwise the parent (non-login) shell which sshd invokes (and which inherits the environment diretly from init (*)) does expand $APPHOME. But this is too early as $APPHOME only gets defined for login shells (via ~/.profile). [added this point after comment from OP]

(*) correct me, if I'm wrong here.

share|improve this answer
    
Hi Thanks for the reply... I tried as suggested but still I am getting a blank output only. –  KumarJohn Mar 15 '13 at 14:25
1  
@user2119462: This becomes really weired, I think I can reproduce your issue now. Try this really ugly workaround: ssh apptst@server2 'bash -l -c "set | grep ^APPHOME"' –  mpy Mar 15 '13 at 14:50
    
@mpy...thanks for the workaround it worked fine. But still could not understand why the first solution is not working –  KumarJohn Mar 15 '13 at 15:06
    
@user2119462 Did you try the improved answer? I'm really interested if that works now, too! –  mpy Mar 15 '13 at 15:07
1  
@mpy...the Improved answer worked. Thanks a lot –  KumarJohn Mar 16 '13 at 8:43

The problem is that when you specify an exact command to run via ssh, the remote sshd does not start a login shell to execute it, but a regular non-interactive shell. In that case, .bash_profile is not executed, and so APPHOME is not defined.

And while typing this, mph has posted the correct solution to force a login shell that processes .bash_profile.

share|improve this answer
    
Thanks Chepner.....but there is no output. I tried to assign it to a variable but still was having the same issue, blank output. –  KumarJohn Mar 15 '13 at 14:53

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.