Fields
Fields

Reputation: 727

Why does executing a command over SSH without a visual terminal use a different PATH location?

When executing an SSH session that simply launches a command instead of actually connecting you, it appears as though my PATH environmental variable differs from when I connect to the SSH session normally, and it's missing the location of my binaries for bash commands. Why would this be, and how can I avoid it?

Normal connection of : ssh root@host Yields a PATH env of

PATH='/sbin;/usr/sbin;/proc/boot'

An ssh to execute command but not connect to the terminal directy (ssh root@host ls) yields "ls: command not found". Upon further inspection, the PATH environmental variable is missing /proc/boot, and thus missing the location of the ls binary file.

The PATH env of this 'non terminal' session yields:

PATH='/usr/sbin;/sbin'

but NOT /proc/boot, so it can't call standard actions like ls,mkdir, etc.

Why is this? How can I get my proper PATH when simply executing a command over SSH, but not connecting directly to a displayed terminal?

Upvotes: 0

Views: 1281

Answers (3)

Serge Ballesta
Serge Ballesta

Reputation: 149125

This is actually a feature. When you use a terminal ssh session, you get an interactive login session. So the sshd daemon starts your login shell (the one that is declared in /etc/password) as a login shell. The profile files are read and initialize various environment parameters and you can the start entering commands - for old dinosaurs it is the rlogin mode, for younger guys it is just a login mode

When you pass a remote command directly on the ssh line, none of the above occurs. The sshd daemon just sets up a default environment and launches the command - it is the rsh mode for dinosaurs or command mode for younger ones.

How to fix:

The best way is to not rely on the PATH when you pass commands directly in the ssh line:

ssh root@host /bin/ls

Alternatively, you can pass commands to an interactive shell (assuming bash on linux):

echo 'ls' | ssh root@host "bash -i"

But beware it is just an interactive shell, not a login shell: the ~/.bashrc will be read, but not ~/.profile nor ~/.bash_profile

Upvotes: 0

Raman Sailopal
Raman Sailopal

Reputation: 12887

#!/bin/bash
dets () {
        sleep 1;
        echo $1
        sleep 1
}
dets "$1" | ssh -T username@ipaddress

Try using the above script passing the command you want to execute to the script i.e. ./sshscr "ls" This will disable pseudo-tty allocation (-T) and then execute the commands through a function det with the commands passed.

Upvotes: 0

Kaushik Nayak
Kaushik Nayak

Reputation: 31686

Run the .profile of the remote server before running commands

  ssh user@host "~/.bash_profile; $command"

Upvotes: 0

Related Questions