Whenever I login to my Linux server I'd like to have several commands run automatically (set some variables, change location, etc.)
This needs to be done on user login, not on system start.
How can I set it to do this?
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.
Sign up to join this communityPut the commands in ~/.bashrc
. Anything in there is executed each time you log in.
If you need commands to only run when logging in via ssh (but not when logging in physically), you could probably test for the presence of the SSH_CONNECTION
environment variable, and only run the commands if you find it exists.
Just put this in ~/.bashrc
or /etc/bash.bashrc
if you want this for all users:
if [[ -n $SSH_CONNECTION ]] ; then
echo "I am logged in remotely"
fi
screen
, I might use your answer and put screen
there instead of the echo. The problem with that is that finishing the screen session will return to the SSH prompt instead of logging out. Just writing out this comment gave me the answer, though: add the logout
command after the screen
command.
exec command
will replace the current shell with whatever you run.
Jan 29, 2017 at 12:37
Alternatively, you can specify a command to be run during the invocation of ssh
:
$ ssh -t server 'cmd; exec bash -l'
The last command in the list should start an interactive session in your preferred shell. If you have a lot of commands to run, consider creating a script file on your SSH server.
Actually ~/.ssh/rc
is a right place for you to add command to run when you log in, rather than any user of the system.
~/.ssh/rc
Commands in this file are executed by ssh when the user logs in,
just before the user's shell (or command) is started. See the
sshd(8) manual page for more information.
If you use a SSH config
file to connect, you can embed a startup command that will only execute when you connect the host.
For this insert / edit the following into your ~/.ssh/config
on your client machine:
Host myhost
HostName *.*.*.*
User root
RequestTTY force
RemoteCommand cd / && bash -i
Put the appropriate hostname and append a new line Port XX
if the port differs from 22. The sample will cd
in the root of the server. && bash -i
and RequestTTY force
are essential to continue usage of the remote terminal.
To connect to your host you have to install your public key on the target machine that you can retrieve like so:
cat ~/.ssh/id_rsa.pub
And install on the remote like so:
mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 644 ~/.ssh/authorized_keys && echo "YOUR_PUBLIC_KEY" >> ~/.ssh/authorized_keys
Then you can simply connect the machine like so:
ssh myhost
And it will connect and execute the RemoteCommand
.
ssh-copy-id -i <path_to_your_keyfile>
. It will handle all the directory creation and access controls for you. However, the ssh-copy-id
command is not available on all systems.
To have a script that will execute for any user on login you can add an additional script in:
/etc/profile.d/
For example:
/etc/profile.d/Hello.sh
Hello `whoami`
On login would produce:
$ ssh MyTestUser@localhost
Hello MyTestUser
The profile script is executed as the user that is logging in. This may or may not be a problem depending on what you want the script to do.
man bash
).