Comment trouver si l'hôte distant est accessible via SSH, sans faire de ssh
J'ai plusieurs hôtes distants connecté à mon serveur local (serveur-Un). POUR s'assurer/filtrer la liste des hôtes qui sont réellement accessibles à localhost , je fais le test de ping.
ping -c1 <remotehost-IP>
if [ "$?" != "0" ];then
echo "Not reachable.Exiting..."
exit 1;
fi
Cependant le test de ping ne pouvait pas me fournir toute vérification pour s'assurer que filtré remotehost-IPs sont accessible via la connexion SSH /port 22.
non-root-user@localhost>ssh 172.26.192.15
ssh: connect to host 172.26.192.15 port 22: Connection refused
non-root-user@localhost>echo $?
1
non-root-user@localhost>ssh -v 172.26.192.15
OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 172.26.192.15 [172.26.192.15] port 22.
debug1: connect to address 172.26.192.15 port 22: Connection refused
ssh: connect to host 172.26.192.15 port 22: Connection refused
Requête:
Au-dessus de vérifier le travail pour moi, si la connexion est refusée. Toutefois, si la connexion SSH est possible, puis-je entrer dans l'hôte distant ou de procéder à l'invite de mot de passe. Qui cause de la barrière de vérifier le code de retour.
Donc je voulais savoir si il y a moyen de vérifier si l'adresse IP à distance accessible ou non accessible via SSH à l'avance. ?
nmap 172.26.192.0/24 -p 22
?OriginalL'auteur | 2016-03-02
Vous devez vous connecter pour publier un commentaire.
Un Bash Solution Spécifique
Si vous utilisez le shell Bash plus précisément, vous avez accès aux sockets TCP et UDP. Par exemple:
Ce ne sera pas vous dire si le protocole utilisé est vraiment SSH, mais est souvent suffisante pour déterminer un port donné est à l'écoute. Votre kilométrage peut varier.
OriginalL'auteur Todd A. Jacobs
Netcat devrait aussi faire le travail.
-z indique que des données sont envoyées et pour ne rechercher que les démons en fonctionnement
La sortie devrait ressembler à quelque chose comme ceci:
Donc, si vous voulez gérer cela d'un peu plus par programmation, vous pouvez simplement jeter la sortie vers /dev/null et vérifiez que le $? est égal à 0 pour vérifier que la connexion est disponible.
il aimait, l'homme! Élégant
OriginalL'auteur Ze_Gitan
C'est le plus simple de commande qui répond à la question (sans besoin de nmap ou nc):
Explication: tentative de connexion avec l'habitude auth méthodes désactivé et grep STDERR pour "Permission refusée". Renvoie un code de sortie 0 si l'hôte est en service SSH, indépendamment des informations d'identification, et ne pas se bloquer en attente de saisie de mot de passe.
-o BatchMode=yes
pour éviter d'attendre pour la saisie au clavier dans tous les cas (par exemple, si l'hôte de l'identité a changé) , et-o ConnectTimeout=5
pour contrôler les horaires. Je préfère également l'ajout de-q
de commande grep pour garder le silence.Si la commande finale pour moi, c'est:
ssh -o BatchMode=yes -o ConnectTimeout=5 -o PubkeyAuthentication=no -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no -o ChallengeResponseAuthentication=no -p 12345 127.0.0.1 2>&1 | fgrep -q "Permission denied"; echo $?
OriginalL'auteur Slack Flag
Les autres réponses sont de vérifier si un processus est à l'écoute sur la machine distante sur le port SSH 22.
Mais ce processus pourrait ne pas être un
sshd
démon (certains administrateurs système sont de commencer d'autres démons sur ce port, par exemple, certains de service HTTPS...).Ou de la télécommande
sshd
démon a été configuré avec un non-shell POSIX. Par exemple, en tant que GCC contributeur, je suis en utilisantssh
thrusvn
àgcc.gnu.org
mais je ne peut pas exécuter une commande shell là...Donc, je crois que vous devriez vraiment essayer la
ssh
de commande. Si la machine distante est POSIX et vous vous attendez à avoir quelques shell Posix praticable thrussh
, essayezssh remotehost /bin/true
(ou peut-êtressh remotehost 'echo $$'
, avec l'espoir queecho
serait un remote shell builtin)Aussi, un
ssh
commande pourrait temporairement en échec (par exemple, parce que l'hôte distant a trop de processus en cours d'exécution en vertu de l'utilisateur, de sorte que lefork
à l'intérieur desshd
échouerait)Si vous voulez que l'intérieur d'un programme, envisager d'utiliser une bibliothèque comme libssh.
BTW, vous pouvez configurer votre local
.ssh/config
de ne jamais demander de mot de passe (ou passer avec-F
certains fichier de configuration spécifique à veiller à ce qu'aucun mot de passe n'est demandé), ou (comme indiqué par CodeGnome), l'utilisationssh -o BatchMode=yes
pour désactiver les invites de mot de passe.seulement dans le cas de l'hôte distant est accessible via SSH
Utilisation
-o BatchMode=yes
pour désactiver les invites de mot de passe.OriginalL'auteur Basile Starynkevitch
Vous pouvez utiliser
nmap
:J'ai essayé sur mon FC machine avec non racine de l'utilisateur, ma version de nmap est de 5,21.
Nmap 3.70? C'est ancienne, vous devriez vraiment envisager la mise à jour.
malheureusement , je n'ai pas de nmap et nc dans l'UNE DE MES machine locale . Je ne suis pas un utilisateur root , je ne peux donc pas les utiliser. J'ai netstate plus proche de ces outils. De toute façon d'obtenir le résultat de la commande netstat ???
OriginalL'auteur dbndhjefj
Grep Sortie de Nmap
Si vous avez besoin d'un statut de sortie, grep les résultats de nmap et utiliser le code de sortie de la commande grep. Par exemple:
Dans cet exemple, le statut de sortie sera de grep, pas de nmap. Grep sera de retour
0
si le port est ouvert, et1
si elle ne l'est pas. Vous pouvez utiliser directement les résultats, ou de la branche hors de$?
. Par exemple:OriginalL'auteur Todd A. Jacobs