まえがき
会社は開発に docker
を使用しています。開発マシンでは、ssh user_name@ip_string
と入力し、パスワード
の入力を確認する必要があります。早い人であれば、間違いを犯すことがよくあります。怠け者として、私はトリックを見つけなければなりません。ssh
コマンドを確認しました。サーバーとの暗号化された対話が必要なため、パスワードを使用して直接ログインするオプションはありません。上。
お勧め: 「Linux チュートリアル」
数日前、同僚がテクノロジーを共有していたとき、彼がコマンド行 ./ を入力しただけであることに気づきました。 test. sh
が開発マシンに正常にログインしました。とても驚いたので、もう一度検索して調べて、この記事を書きました。
シェルスクリプトの基礎
ssh自動ログインスクリプトを書く前に、文法とかではなくシェルスクリプトの基礎についてお話します。シェルスクリプトの動作仕組みをまとめてみました~
シェルスクリプトの実行方法
まずは、 についてお話します。シェルの起動方法はスクリプトを踏んで起動する方法がいくつかあり、当初は10分で完了するスクリプトをそのまま実行してみたところ、完了までに2時間かかりました。同時に、シェルを実行してその理由を知ることもできます。
ファイル名で実行
シェルスクリプトはファイル名で直接実行できますが、ファイルには実行権限が必要です。 sudo chmod x ./file_name.sh を通じてファイルに実行権限を追加します
;
ファイルを実行するためのスクリプト インタプリタを指定します
通常、 use sh file_name.s
h は、スクリプトを解釈して実行するためのスクリプト インタープリター /bin/sh
を指定します。一般的なスクリプト インタープリターには次のものが含まれます: /bin/bash
お待ちください。 ls -l /bin/*sh
コマンドを使用して現在利用可能なスクリプト インタプリタを表示できます;
../file_name またはsource コマンドを使用してスクリプトを実行します
このメソッドは、最初の 2 つのメソッドのように子プロセスをフォークしてスクリプトを実行しませんが、現在のシェル環境を使用して実行します。.bashrc または .bash_profile が変更されるときに使用されます。シェルを再起動するか、システムに再度ログインして現在の変更を有効にする必要があります。
shebang
シェル スクリプトを記述するときは、必ず先頭に #!/binbash という行を追加しますが、これがスクリプトのシバンです。奇妙な名前です。C 言語と Unix の開発者であるデニス・リッチー氏は、これは「ハッシュバン」に似た英国風の説明文である可能性があると述べています。
Wiki に説明を投稿してください:
コンピューター サイエンスでは、シバンはポンド記号と感嘆符で構成される文字列行であり、テキスト ファイルの最初の行の最初の 2 文字として表示されます。ファイル内にシバンが存在する場合、Unix 系オペレーティング システムのプログラム ローダーはシバンの後の内容を分析し、これらの内容をインタプリタ命令として使用し、その命令を呼び出し、シバンを含むファイル パスをインタプリタ パラメータとして使用します。
簡単に言えば、このスクリプトを実行するときのインタプリタを示します。そのため、ファイル名を使用してシェル スクリプトを直接実行する場合は、シバンを含める必要がありますが、直接追加することもできます。シバン オプションの後、実行時にデフォルトでこのオプションが使用されます;
たとえば、test.sh のシバンは #!/bin/sh -x であり、スクリプトを実行するときは次のようになります:
./test.sh hello
は次と同等です:
bin/sh -x ./test.sh hello;
ssh 自動ログイン スクリプトを作成するには、必要なシバン (インタープリタ) は /usr/bin/expect;
script インタープリタを使用して script を実行すると、シバンは指定されたスクリプト インタープリタによって上書きされます。つまり、指定されたスクリプト インタープリタがスクリプトの実行に最初に使用されます (私は普段 sh ./test.sh を使用しますが、プロンプト コマンドが見つかりません)
expect の説明
#expect は、自動かつ対話型のタスクを実現できるインタプリタであり、一般的なシェル構文コマンドも解釈できます。その特徴は次のコマンドです。 spawn コマンド:spawn コマンド コマンドは、コマンド コマンドを実行するために子プロセスをフォークし、この子プロセス内で後続のコマンドを実行します。 ssh 自動ログイン スクリプト、spawn ssh user_name@ip_str を使用し、子プロセスをフォークして ssh ログイン コマンドを実行します。
expect コマンド:expect コマンドはExpect インタープリタの key コマンドとその一般的な使用法は、expect "string" です。つまり、文字列 string の取得が期待される場合は、文字列 string; After string で * などのワイルドカードを使用できます。コマンド ラインから返された情報と一致する場合、期待値はすぐに実行されます。スクリプト;
set timeout コマンド:set timeout n コマンドは、期待値の待機タイムアウトを設定します。コマンドを n 秒まで送信しましたが、n 秒以内に期待値が取得されませんでした。コマンド、期待値が false の場合、スクリプトは実行を続行します。##コマンドを送信します:
#send コマンドの一般的な使用法は send "string" です。これらは通常のコマンドと同じようにコマンド ラインに情報を入力します。もちろん、文字列の後に \r を追加して示すことを忘れないでください。
コマンドを入力してください:
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
命令,回车,真正的一键登陆!
以上がSSH自動ログインを実現するシェルの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。