Maison >Opération et maintenance >exploitation et maintenance Linux >Explication détaillée du shell pour implémenter la connexion automatique SSH
Avant-propos
La société développe et utilise docker
Saisissez toujours ssh user_name@ip_string
à chaque fois que vous vous connectez. sur votre machine de développement. , puis confirmez la saisie password
Si vous êtes rapide, vous ferez souvent des erreurs. En tant que paresseux, je dois trouver une astuce. J'ai coché la commande ssh
Comme elle nécessite une interaction cryptée avec le serveur, il n'y a pas d'option pour se connecter directement avec un mot de passe, j'ai donc dû abandonner.
Recommandé : "Tutoriel Linux"
Lorsqu'un collègue partageait la technologie il y a quelques jours, j'ai vu qu'il n'avait saisi qu'une ligne de commandes ./test.sh
et avec succès connecté. J'ai été très surpris lorsque j'ai développé la machine, alors je suis revenu pour la chercher et l'étudier, et j'ai finalement écrit cet article.
Bases des scripts shell
Avant d'écrire le script de connexion automatique ssh, parlons des bases des scripts shell. Ces bases ne sont pas une grammaire ou quelque chose comme ça, c'est le cas. partout sur Internet. Voici un résumé du mécanisme de fonctionnement du script shell~
Comment fonctionne le script shell
Tout d'abord, parlons de plusieurs startups. méthodes du shell, qui consiste à démarrer le script. Je viens d'utiliser le script qui prenait initialement dix minutes, mais cela a pris deux heures. En même temps, cela nous permet également d'exécuter le shell et de savoir pourquoi.
Exécuter via le nom de fichier
Le script Shell peut être exécuté directement via le nom de fichier. Il convient de noter que le fichier nécessite une autorisation d'exécution. Utilisez sudo chmod +x ./file_name.sh
pour ajouter des autorisations d'exécution au fichier ;
spécifiez l'interpréteur de script pour exécuter le fichier
Le sh file_name.s
h couramment utilisé consiste à spécifier le script. interpréteur/bin/sh
pour interpréter et exécuter des scripts ; les interpréteurs de scripts courants incluent : /bin/bash
, etc. Nous pouvons utiliser la commande ls -l /bin/*sh
pour afficher les interpréteurs de script actuellement disponibles
utilise ./ file_name Ou utilisez la commande source pour exécuter le script
Cette méthode ne crée pas de sous-processus pour exécuter le script comme les deux premières méthodes, mais utilise l'environnement shell actuel pour l'exécuter pour .bashrc ou .bash_profile à modifier, nous n'avons pas besoin de redémarrer le shell ou de nous reconnecter au système pour que les modifications actuelles prennent effet.
shebang
Lorsque nous écrivons un script shell, nous ajoutons toujours une ligne #!/binbash au début, qui est le shebang du script. on l'appelle ainsi. C'est un nom étrange. Dennis Ritchie, le développeur du langage C et d'Unix, a dit qu'il s'agissait peut-être d'un texte descriptif de style britannique similaire à "hash-bang"
J'ai publié une explication sur le wiki :
En informatique, un shebang est une ligne de chaîne composée d'un signe dièse et d'un point d'exclamation, qui apparaissent comme les deux premiers caractères de la première ligne d'un fichier texte. Lorsqu'un Shebang existe dans le fichier, le chargeur de programme du système d'exploitation de type Unix analysera le contenu après le Shebang, utilisera ce contenu comme instructions d'interprétation, appellera l'instruction et utilisera le chemin du fichier contenant le Shebang comme paramètres d'interprétation.
En termes simples, il indique l'interpréteur lorsque ce script est exécuté. Par conséquent, lorsque vous utilisez le nom de fichier pour exécuter directement le script shell, le shebang doit être inclus en plus, nous pouvons également l'ajouter ; directement après l'option shebang, on utilise l'option par défaut lors de l'exécution ;
Par exemple, le shebang de test.sh est #!/bin/sh -x, puis quand on exécute le script :
./test.sh hello
est équivalent à :
bin/sh -x ./test.sh hello;
Pour écrire un script de connexion automatique SSH, le shebang (interprète) nécessaire est /usr/bin/expect ;
Il convient de noter que lors de la spécification l'interpréteur de script pour exécuter le script, le shebang sera écrasé par l'interpréteur de script spécifié, c'est-à-dire que l'interpréteur de script spécifié sera utilisé en premier pour exécuter le script (j'utilise habituellement sh ./test.sh mais la commande d'invite est introuvable)
expect explication
expect est un interpréteur qui peut réaliser des tâches automatiques et interactives. Il peut également interpréter les commandes de syntaxe shell courantes. Ses fonctionnalités sont les commandes suivantes :
commande spawn :
La commande spawn command créera un processus enfant pour exécuter la commande commande, puis exécutera les commandes suivantes dans ce processus enfant ; Dans le script de connexion automatique ssh, nous utilisons spawn ssh user_name@ip_str et forkons un processus enfant pour exécuter la commande de connexion sshexpect command :
expect command est ; le raccourci clavier de l'interpréteur expect, et son utilisation générale est expect "string", c'est-à-dire que si vous espérez obtenir une chaîne de caractères, vous pouvez utiliser des caractères génériques tels que * dans la chaîne de caractères après La chaîne correspond aux informations renvoyées par la ligne de commande, expect sera exécuté immédiatement. Scriptcommande set timeout :
la commande set timeout n définit le délai d'attente du. attendez la commande à n secondes, et l'attente n'a pas été obtenue dans la commande n secondes, si l'attente est fausse, le script continuera à s'exécuterenvoyer la commande :
L'utilisation générale de la commande send est send "string", ce sera notre habituel Entrez une information dans la ligne de commande tout comme saisir une commande. Bien sûr, n'oubliez pas d'ajouter r après la chaîne pour l'indiquer. Entrez ;commande d'interaction :
interact命令很简单,执行到此命令时,脚本fork的子进程会将操作权交给用户,允许用户与当前shell进行交互;
完成脚本
以下是一个完成版的脚本 test.sh:
#!/usr/bin/expect // 指定shebang set timeout 3 // 设定超时时间为3秒 spawn ssh user_name@172.***.***.*** // fork一个子进程执行ssh命令 expect "*password*" // 期待匹配到 'user_name@ip_string's password:' send "my_password\r" // 向命令行输入密码并回车 send "sudo -s\r" send "cd /data/logs\r" // 帮我切换到常用的工作目录 interact // 允许用户与命令行交互
执行 sudo chmod +x ./test.sh
命令给shell脚本添加执行权限;
运行 ./test.sh
命令,一键登陆成功!
简单的几个命令,,搭配起来解决了与命令行的交互问题后,很多复杂的功能也不在话下了~
alias别名
脚本完成了,可是还是有些小瑕疵:
输入./file_name.sh
命令太长。。。
只能在脚本目录中才能执行,不然使用绝对路径输出的命令更长。
这里我们想到了linux的alias命令:
alias命令:
alias命令使用方式为 alias alias_name="ori_command"
,将alias_name
设置为ori_command
的别名,这样我们输入执行alias_name
,就相当于执行了ori_command;
可是,我们会发现,当你关闭当前shell后,再打开一个shell窗口,再使用alias_name,系统提示command not found;
有没有能保持命令的方式呢?编辑bash_profile
文件。
bash_profile文件
我们编辑bash_profile文件,此文件会在终端窗口创建的时候首先执行一次,所以可以帮我们再设置一次别名;
执行命令vim ~./bash_profile,
在文件内部添加:
alias alias_name="/root_dir/../file_name.sh
保存后,再使用 . ~./bash_profile
或source ~./bash_profile
在当前脚本执行一遍设置别名命令,完成设置;
这样,我们无论在哪个目录,只要输入alias_name
命令,回车,真正的一键登陆!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!