Source d'un fichier après que la connexion ssh passe à l'invite

Aug 16 2020

Question à une ligne: Comment puis-je générer automatiquement un fichier distant sur un hôte distant après m'être connecté via SSH via un hôte bastion?

J'ai besoin de trouver un fichier contenant une liste d'alias + fonctions définies par l'utilisateur du shell sur un hôte distant après y avoir ssh-ing.

Le fichier existe sur l'usinage à distance dans le dossier / tmp, par exemple / tmp / my-rc

Recherche d'autres messages et Internet que j'ai trouvés

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

Le problème est que j'obtiens un terminal, mais aucun des alias n'est défini car c'est un nouveau shell bash '

Pensant que la source doit être faite après que le shell est attaché, essayez ce qui suit, mais cela ne fonctionne pas non plus. Il n'y a pas d'erreur, je reçois le terminal mais je ne pense pas que le fichier a été obtenu (vérifié en faisant écho à un message factice à partir du fichier / tmp / my-rc)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

Même essayé avec '.' au lieu de la source, pas de chance.

De l'aide.

Note 1: Bash ou ZSH n'importe quelle solution shell ferait l'affaire.

Note 2: l'actuall ssh se fait via une commande proxy, c'est-à-dire un hop over bastion host (en mentionnant simplement si cela est pertinent)

Note 3: Je n'ai pas le privilège d'un profil rc ou bashrc ou même d'un répertoire personnel sur l'hôte distant.

Note4: La commande exacte que j'ai utilisée pour me connecter à l'hôte sécurisé est via l'hôte bastion comme ci-dessous

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

Réponses

4 StéphaneChazelas Sep 01 2020 at 23:09

Avec bash, vous pouvez faire:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

Ce qui entraînerait /tmp/my-rcune source avant l'invite, et uniquement cette invite puisque nous ne sommes pas définis PROMPT_COMMANDpar la suite.

Vous voudrez supprimer le unset PROMPT_COMMANDif /tmp/my-rcfinit par le définir.

Ce qui précède suppose que le shell de connexion de l'utilisateur distant est de type Bourne, mais vous devriez pouvoir l'adapter à la plupart des autres types de shells (csh / rc / fish).

2 fra-san Sep 01 2020 at 22:30

Étant donné que vous pouvez écrire sur l'hôte distant /tmp, vous pouvez créer un /tmp/myhomerépertoire dessus, y placer le profil de vos shells et les fichiers d'initialisation, puis démarrer Zsh avec ZDOTIDRset to /tmp/myhomeet Bash avec HOMEset to /tmp/myhome.

Par défaut, Zsh recherche ses fichiers d'initialisation dans $ZDOTDIR, $HOMEsi par défaut ZDOTDIRn'est pas défini.

Par conséquent, vous pouvez démarrer Zsh sur l'hôte distant en tant que:

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

Et Bash comme:

ssh -t user@host HOME=/tmp/myhome bash

Bien sûr, vous pouvez être créatif avec vos fichiers de profil / d'initialisation - par exemple, utilisez-les pour définir HOMEun chemin plus approprié, source d'autres fichiers (si vous aviez déjà des fichiers à points quelque part sur l'hôte distant), etc.

Une application minimale de cette approche, condensée en une seule commande, pourrait être:

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

(Utilisez mkdir -p ...pour éviter qu'une erreur ne s'affiche lorsqu'elle /tmp/myhomeexiste déjà, par exemple si vous vous reconnectez à l'hôte distant et que vous savez déjà que le répertoire est là).

En ProxyCommandtenant compte de votre , cela pourrait être:

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

Enfin, à propos de vos tentatives: ssh -t [email protected] 'bash -l; source /tmp/my-rc'ne fonctionne pas car la sourcecommande n'est exécutée qu'après la fermeture du shell interactif.

1 jakethefinn Sep 04 2020 at 19:40

Si UsePAM est défini sur yes dans le fichier sshd_config des hôtes distants, le fichier de configuration /etc/pam.d/sshd vous permet d'automatiser l'exécution de la commande lors d'une connexion réussie, entre autres événements du processus d'authentification. Ajoutez cette ligne de code

session    required     pam_exec.so /etc/myscripts/./sourcing-script

directement au-dessus de ces lignes

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

où / etc / myscripts / sourcing-script est simplement un fichier sur l'hôte distant avec la commande à exécuter après une connexion réussie.

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

J'utilise cette méthode pour arrêter un service et le signaler dans un fichier journal, avant que ma session ssh ne soit ouverte. Avant de me déconnecter, j'ai configuré un crontab pour démarrer le service, de sorte qu'il ne fonctionne jamais en parallèle avec ma session ssh.

dirkt Aug 16 2020 at 13:40

Généralement, vous faites cela dans $HOME/.profileou dans des variantes.

sshdéfinit les variables d'environnement en commençant par SSH_, vous pouvez les utiliser pour déterminer si vous vous êtes connecté via sshou directement.