RemoteCommand en SSH

On va parler aujourd’hui de SSH et de certains usages avancés.

Lancer une commande sur une machine distante

Quelques exemples.

ssh serveur.domaine.net 'cat /etc/hostname'
ssh serveur.domaine.net 'systemctl restart nginx'
ssh -t serveur.domaine.net 'journalctl -f'
ssh -t serveur.domaine.net 'tail -f /var/log/syslog'
ssh -t serveur.domaine.net 'htop'
ssh -t virtualisation.domaine.net 'virsh console dns1'
ssh -t virtualisation.domaine.net 'virsh console dns1; bash -l'
cat ~/Config/bashrc_serveur | ssh serveur.domaine.net 'cat >> ~/.bashrc' OU ssh serveur.domaine.net 'cat >> ~/.bashrc' < ~/Config/bashrc_serveur
ssh 192.168.3.10 'bash -s' < script.sh

Sur mon Pi j’ai alias temp='/opt/vc/bin/vcgencmd measure_temp' afin de connaître sa température, pour lancer un alias d’une machine distante :
ssh -t pi bash -ic 'temp'

Pour lancer une fonction de mon poste local sur une machine distante : ssh serveur.domaine.net "$(typeset -f getinfo); getinfo /etc/hostname"

Sources :
https://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-run-command-on-remote-machine-server/
https://www.cyberciti.biz/faq/use-bash-aliases-ssh-based-session/
https://stackoverflow.com/questions/22107610/shell-script-run-function-from-script-over-ssh

RemoteCommand dans ssh_config

OpenSSH 7.6 publié le 03/10/2017 apporte l’option RemoteCommand : Specifies a command to execute on the remote machine after successfully connecting to the server. man ssh_config puis /RemoteCommand. Elle permet de lancer des commandes qui seront exécutées à la connexion, on peut s’en servir pour mettre en place une sorte d’environnement de travail par défaut.

Se placer automatiquement dans le dossier voulu.

RemoteCommand cd /data/production; bash -l
RequestTTY yes

Lancer un screen à la connexion.

RemoteCommand screen -DR
RequestTTY yes

Parfois on se connecte sur certaines machines pour y effectuer toujours la même action/vérification.

RemoteCommand htop; bash -l
RequestTTY yes

Pour se connecter ainsi ssh serveur, voici un exemple de ~/.ssh/config.

Host serveur
        Hostname serveur.domaine.net
        Port 2222
        IdentityFile ~/.ssh/id_ed25519_serveur
        RemoteCommand clear; bash -l
        RequestTTY yes

Cannot execute command-line and remote command

Un problème important que vous allez rencontrer si vous utilisez RemoteCommand dans ~/.ssh/config (ou /etc/ssh/ssh_config), lancez ssh serveur 'commande' et vous aurez le message : Cannot execute command-line and remote command. Il n’est pas possible d’utiliser en même temps RemoteCommand ET lancer une commande sur une machine distante en SSH.

Pour se sortir de ce problème, on va employer l’option Match (man ssh_config puis /Match).

Match host serveur exec "[[ $(ps h o args p $PPID | wc -w) -eq 2 ]]"
        Hostname serveur.domaine.net
        Port 2222
        IdentityFile ~/.ssh/id_ed25519_serveur
        RemoteCommand clear; bash -l
        RequestTTY yes

Pas le truc le plus simple mais élégant et astucieux, trouvé ici. Sur le même principe, on aurait pu également utiliser Match exec "[[ $(ps -p $PPID -o args=) == 'ssh serveur' ]]", ça aidera le lecteur à comprendre ce que font ces lignes de commande ^^

À noter donc que si vous ajoutez une option supplémentaire, exemple ssh -6 serveur (-6 : Forces ssh to use IPv6 addresses only) alors les conditions Match exec ci-dessus ne sont plus vraies.

Usages

RemoteCommand screen -DR pour les commandes/tâches longues, RemoteCommand cd /data/production; bash -l pour se placer dans le bon dossier, RemoteCommand clear; bash -l pour effacer le contenu du terminal (attention tout message à la connexion comme le motd ou « WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! » ne sera alors plus visible, assez mauvais d’un point de vue sécurité), le panel des possibilités est large.

Les commentaires sont ouverts, je réponds aux questions.

Déjà 5 avis pertinents dans RemoteCommand en SSH

  • Jacques Le Brillant
    Je ne vois toujours pas l’intérêt de RemoteCommand quand on peut faire un `ssh -t serveur.domaine.net ‘htop’`
    D’ailleurs, c’est toujours pas très clair pour moi. Surtout quand je lis « Il n’est pas possible d’utiliser en même temps RemoteCommand ET lancer une commande sur une machine distante en SSH » J’aurai besoin d’une petite clarification. On ne peut donc pas lancer une commande alors qu’on utilise RemmoteCommand! On ne peut pas dire qu’on aide les non-super-geeks SSH à comprendre…

Les commentaires sont fermés.