11

I am trying to use plink as an ssh alternative on windows, but I am finding that when plink connects to a remote linux machine, it does not source .bash_profile or .bashrc.
Is there a different dot file I should create? Or is there another option?

For example, my bashrc file adds a directory to my path. This directory contains extra programs that I want to use, one being python.

This will not work:

plink host python

Where as this will:

plink host "source .bashrc;python"

When I use plink without a command parameter, it sources .bash_profile and everything works fine, but it appear that by merely sending a command plink will not source either file.

Is there a workaround?

Charles
  • 3,734
  • 3
  • 31
  • 49

2 Answers2

9

The accepted answer helped me solve the same problem using plink. Here is a bit more detail that may help people in future:

When a ssh connection is made to run a single command using plink, bash is not invoked as an "interactive login shell", so it doesn't run /etc/profile, ~/.bash_profile, ~/.bash_login, or ~/.profile (see the bash manual pages).

For my purposes, I needed ~/.profile to run prior to the command passed in the plink command line.

A forced command can be added to the authorized_keys file for that key (see the sshd manual pages). A forced command (e.g. to run ~/.profile) stops it running the command specified by plink, so to get it to do both, the forced command should be to execute a script that runs .profile then the original plink command. The latter is stored in an environment variable $SSH_ORIGINAL_COMMAND so your script can do

source .profile
$SSH_ORIGINAL_COMMAND

and you specify the script in the ~/.ssh/authorized_keys file as follows, before the key, on the same line:

command="source forced_command.script" ssh-rsa A3AABzaC1yc...
Spalteer
  • 454
  • 4
  • 11
7

If you simply connect to a remote host via ssh or plink, it will start the login account's default shell. If that shell is bash, bash will automatically source .bash_profile.

If you connect to a remote host via ssh or plink asking for a command to be executed, ssh will try to execute just that command.

What you want to achieve can be done by using a ForcedCommand. See also here:

Set the forced command to be a script that does 2 things:

  1. source the .bash_profile
  2. run original command (env vars $SSH_ORIGINAL_COMMAND or $SSH2_ORIGINAL_COMMAND)
Community
  • 1
  • 1
Kurt Pfeifle
  • 86,724
  • 23
  • 248
  • 345
  • I wondered why creating a shell script that replicated the bash_profile call and then ran whatever command you wanted plink to call wasn't easier until I clued in that this answer "teaches all plink commands how to fish", so to speak, correct? That is, the .sh route is easier if you're running the same command each time, but requires a .sh-per-command or command-batch, while this solves the missing profile across the board. – ruffin Jan 08 '15 at 16:11