Je suis en train de mettre en place une configuration bash assez complexe qui sera utilisée sur plusieurs machines. J'essaie de savoir s'il est possible de déterminer si je suis connecté via SSH ou sur une machine locale. De cette façon, je pourrais, par exemple, définir certains alias en fonction de ce fait. Comme aliasing halt
à restart
depuis l' arrêt d' un serveur distant pourrait ne pas être la meilleure chose à faire.
Ce que je sais jusqu'à présent, c'est que la variable d'environnement SSH_CLIENT
est définie lorsque je me suis connecté via ssh. Malheureusement, cette variable est ignorée lorsque je démarre un shell super utilisateur avec sudo -s
. Je sais également que je peux transmettre à sudo un paramètre qui demande à sudo de copier toutes mes variables d'environnement dans le nouvel environnement shell, mais si je ne veux pas le faire, y a-t-il une autre façon?
ps afx
et le TTY pour le shell qui ne fonctionne pasps
sera l'autre connexion.who am i
.who am i
, afin que vous puissiez déterminer à partir de là si vous êtes SSHing ou non. Cela fonctionne:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
who
avec deux arguments supplémentaires.who am i
est identique àwho is me
ouwho is awesome
ouwho potato potato
. Un fait que j'ai trouvé un peu intéressant.Voici une excellente réponse que j'ai trouvée sur unix.stackexchange :
SSH_CLIENT
ouSSH_TTY
est définie, c'est une session ssh.ps -o comm= -p $PPID
. Si c'est le cassshd
, c'est une session ssh.la source
Vous pouvez ajouter
SSH_*
àenv_keep
ensudoers
sorte que cela peut être détecté lors commuté à l'autre utilisateur.la source
Si vous voulez savoir si votre shell bash est directement un processus enfant de sshd (pas n> 1 couches de profondeur), vous pouvez
il doit vous donner
sshd
ou quel que soit le nom du processus parent de votre shell actuel.la source
ps -o cmd= $PPID
ouawk '/^Name:/ {print $2}' /proc/$PPID/status
Je pense que vous voulez repenser la façon dont vous envisagez le problème. La question n'est pas "suis-je connecté via SSH, car je veux désactiver certaines commandes." C'est "suis-je connecté à la console, car alors j'activerai certaines commandes."
la source
Oui, comme d'autres l'ont noté, les informations sont en présence de votre IP entre parenthèses dans la sortie de
who am i
.Vous pouvez utiliser des expressions régulières Bash pour le détecter:
la source
J'ai trouvé ce qui suit, basé sur les conseils des autres ici.
Il utilise une variable pour la mise en cache - je l'utilise dans mon thème shell.
Source:
is_ssh
dans https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .la source
Recherchez la ligne de commande parent de votre shell et recurse. Peut-être quelque chose comme ceci:
Modifié pour que cela fonctionne réellement :)
la source
Toutes les autres réponses fonctionnent si vous êtes au premier niveau de connexion. Mais si, une fois connecté, vous exécutez 'su' ou 'sudo' (dans mon cas, pour basculer vers un compte utilisateur sans shell pour des raisons de sécurité, je devais exécuter: sudo su - <userid> -s / bin / bash - l) , leur solution échoue.
Voici une solution universelle; en utilisant pstree, vous vérifiez sshd en tant que parent.
Voici la sortie de l'egrep, lorsque --quiet est supprimé. Il montre toute la hiérarchie qui correspond si l'on est connecté à distance.
la source
Veuillez garder à l'esprit que cette réponse est très, très spécifique à Linux.
Cela fait une hypothèse clé: le processus de connexion n'aura pas de TTY de contrôle; vous voulez probablement vérifier si vous avez un ATS de contrôle avant d'exécuter ce code (qui, selon vos besoins, est probablement une valeur sûre, de toute façon).
Le code itère vers le haut dans l'arborescence des processus, jusqu'à ce qu'il trouve le processus qui n'a pas de téléscripteur de contrôle.
$initiator_name
sera le nom de ce processus ("sshd", par exemple).la source