Vorwort
Das Unternehmen entwickelt und verwendet docker
. Geben Sie bei jedem Login immer ssh user_name@ip_string
ein an Ihre Entwicklungsmaschine und bestätigen Sie dann die Eingabe password
. Wenn Sie schnell sind, machen Sie oft Fehler. Als fauler Mensch muss ich einen Trick finden. Da er eine verschlüsselte Interaktion mit dem Server erfordert, gibt es keine Möglichkeit, sich direkt mit einem Passwort anzumelden, also musste ich aufgeben. ssh
eingegeben hatte, und zwar erfolgreich Eingeloggt. Ich war sehr überrascht, als ich die Maschine entwickelte, also kam ich zurück, um sie zu suchen und zu studieren, und schrieb schließlich diesen Artikel. ./test.sh
Grundlagen von Shell-Skripten
Bevor wir das automatische SSH-Anmeldeskript schreiben, sprechen wir über die Grundlagen von Shell-Skripten, es ist keine Grammatik oder so etwas Überall im Internet. Hier ist eine Zusammenfassung des Funktionsmechanismus des Shell-Skripts Es geht darum, zunächst das Skript auszuführen, das ursprünglich zehn Minuten in Anspruch nahm, die Fertigstellung jedoch zwei Stunden dauerte. Gleichzeitig ermöglicht es uns auch, die Shell auszuführen und zu erfahren, warum.Über den Dateinamen ausführen
Shell-Skript kann direkt über den Dateinamen ausgeführt werden. Es ist zu beachten, dass für die Datei eine Ausführungsberechtigung erforderlich ist. Verwenden Sie, um der Datei Ausführungsberechtigungen hinzuzufügen.
geben Sie den Skriptinterpreter an, der die Datei ausführen soll.
Das häufig verwendete sudo chmod +x ./file_name.sh
h dient zur Angabe des Skripts Interpreter
usw. Wir können den Befehl verwenden, um die aktuell verfügbaren Skriptinterpreter anzuzeigen. Dateiname Oder verwenden Sie den Quellbefehl, um das Skript auszuführen
Diese Methode forkt keinen Unterprozess zur Ausführung des Skripts wie die ersten beiden Methoden auf, sondern verwendet die aktuelle Shell-Umgebung, um es für .bashrc auszuführen oder .bash_profile geändert werden, müssen wir die Shell nicht neu starten oder uns erneut beim System anmelden, damit die aktuellen Änderungen wirksam werden. sh file_name.s
/bin/sh
/bin/bash
Shebangls -l /bin/*sh
Wenn wir ein Shell-Skript schreiben, fügen wir am Anfang immer eine Zeile #!/binbash hinzu, die der Grund dafür ist Es heißt so. Es ist ein seltsamer Name. Dennis Ritchie, der Entwickler der C-Sprache und von Unix, sagte, es könnte sich um einen beschreibenden Text im britischen Stil handeln, der „Hash-Bang“ ähnelt. Hat eine Erklärung im Wiki gepostet:
In der Informatik ist ein Shebang eine Zeichenfolge, die aus einem Nummernzeichen und einem Ausrufezeichen besteht, die als die ersten beiden Zeichen der ersten Zeile einer Textdatei erscheinen. Wenn in der Datei ein Shebang vorhanden ist, analysiert der Programmlader des Unix-ähnlichen Betriebssystems den Inhalt nach dem Shebang, verwendet diesen Inhalt als Interpreteranweisungen, ruft die Anweisung auf und verwendet den Dateipfad, der den Shebang enthält, als Interpreterparameter.Einfach ausgedrückt gibt es den Interpreter an, wenn dieses Skript ausgeführt wird. Wenn Sie also den Dateinamen zum direkten Ausführen des Shell-Skripts verwenden, können wir ihn auch anhängen direkt nach der Shebang-Option verwenden wir die Option standardmäßig bei der Ausführung;
Der Shebang von test.sh lautet beispielsweise #!/bin/sh -x, und wenn wir das Skript ausführen:
./test.sh hello
ist äquivalent zu:
bin/sh -x ./test.sh hello;
Um ein automatisches SSH-Anmeldeskript zu schreiben, ist der benötigte Shebang (Interpreter) /usr/bin/expect;Das sollte bei der Angabe beachtet werden Der Skriptinterpreter zum Ausführen des Skripts wird vom angegebenen Skriptinterpreter überschrieben, das heißt, der angegebene Skriptinterpreter wird zuerst zum Ausführen des Skripts verwendet (ich verwende normalerweise sh ./test.sh, aber der Eingabeaufforderungsbefehl wurde nicht gefunden).expect-Erklärung
expect ist ein Interpreter, der automatische und interaktive Aufgaben realisieren kann. Er kann auch gängige Shell-Syntaxbefehle interpretieren:
Spawn-Befehl:Der Spawn-Befehl verzweigt einen untergeordneten Prozess, um den Befehlsbefehl auszuführen, und führt dann nachfolgende Befehle in diesem untergeordneten Prozess aus Im automatischen SSH-Anmeldeskript verwenden wir spawn ssh user_name@ip_str und forken einen untergeordneten Prozess, um den SSH-Anmeldebefehl
Expect-Befehl auszuführen:Expect-Befehl ist Der Schlüsselbefehl des Expect-Interpreters und seine allgemeine Verwendung ist „expect“ (Zeichenfolge). Wenn Sie also erwarten, eine Zeichenfolge zu erhalten, können Sie in der Zeichenfolge „string“ Platzhalter wie * verwenden Die Zeichenfolge entspricht den von der Befehlszeile zurückgegebenen Informationen. Es wird erwartet, dass das Skript sofort ausgeführt wird.
Befehl „set timeout“: Erwarten Sie den Befehl auf n Sekunden und der Erwartungswert wurde nicht innerhalb von n Sekunden erreicht. Wenn der Erwartungswert falsch ist, wird das Skript weiterhin ausgeführt:Die allgemeine Verwendung des Sendebefehls ist „Sendezeichenfolge“. Dies ist unsere übliche Eingabe einer Information in die Befehlszeile, genau wie bei der Eingabe eines Befehls. Vergessen Sie natürlich nicht, nach der Zeichenfolge ein „r“ hinzuzufügen, um dies anzuzeigen Geben Sie den Befehl
ein:
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
命令,回车,真正的一键登陆!
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Shell zur Implementierung der automatischen SSH-Anmeldung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!