Source d'un fichier après que la connexion ssh passe à l'invite
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
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-rc
une source avant l'invite, et uniquement cette invite puisque nous ne sommes pas définis PROMPT_COMMAND
par la suite.
Vous voudrez supprimer le unset PROMPT_COMMAND
if /tmp/my-rc
finit 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).
Étant donné que vous pouvez écrire sur l'hôte distant /tmp
, vous pouvez créer un /tmp/myhome
répertoire dessus, y placer le profil de vos shells et les fichiers d'initialisation, puis démarrer Zsh avec ZDOTIDR
set to /tmp/myhome
et Bash avec HOME
set to /tmp/myhome
.
Par défaut, Zsh recherche ses fichiers d'initialisation dans $ZDOTDIR
, $HOME
si par défaut ZDOTDIR
n'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 HOME
un 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/myhome
existe 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 ProxyCommand
tenant 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 source
commande n'est exécutée qu'après la fermeture du shell interactif.
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.
Généralement, vous faites cela dans $HOME/.profile
ou dans des variantes.
ssh
définit les variables d'environnement en commençant par SSH_
, vous pouvez les utiliser pour déterminer si vous vous êtes connecté via ssh
ou directement.