スクリプトリンクssh自動入力パスワード

5784 ワード

先週の仕事で、いくつかの重複した仕事に出会って、便利さのためにスクリプトを書きました.
このスクリプトでは、s s h sshを介してリモートサーバにリンクし、特定の操作を実行する必要がありますが、サーバをリンクする場合、s s h sshはマシンを信頼しているかどうかを検証する必要があります(最初のリンクではy e s yesを入力する必要があります)、パスワードを入力する必要があります.毎回自分で手動で操作すると、スクリプトの意味がなくなります.このとき,e x p e c t expect expectスクリプトが役に立つ.
まずe x p e c t expect expectをインストールします.デフォルトではこれをインストールしていないので、U b u n t u Ubuntu Ubuntuシステムはs u d oを直接通過することができます.  a p t − g e t   i n s t a l l   e x p e c t sudo\apt-get\install\expect sudo apt−get install expectをインストールし、e x p e c t expectスクリプトを書きます.l o g i n−v i a−s s h login−via−ssh login−via−sshと言います.スクリプトにパラメータがなければ、直接e x p e c t  l o g i n − v i a − s s h expect\login-via-ssh expect login−via−sshでいいので、e x p e c t expect expectでこのスクリプトを実行する必要があることに注意してください.他のs h e l l shell shellツールではこのスクリプトを解析できません.
しかし、ここで書いたl o g i n−v i a−s s h login−via−ssh login−via−sshスクリプトにはいくつかのパラメータがあります.
Usage: expect login-via-ssh username password hostname realip script

主な機能はs s h sshを通じてユーザー名u s e r n a m e username username、パスワードp a s s s w o r d password passwordのサーバーにリンクし、サーバーのホスト名はh o s t n a m e hostname hostname、真実のI P IPアドレスはr e a l i p realip realip、このサーバにリンクして、s c r i p t script scriptスクリプトを実行します.
#!/usr/bin/expect -f

set timeout 10
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
set realip   [lindex $argv 3]
set script   [lindex $argv 4]

spawn ssh -l $username $realip "echo '$password' | sudo -S ~/$script $hostname"

expect {
    "(yes/no)?" {
        send "yes
"
expect "password:" send "$password
"
} "password:" { send "$password
"
} } interact

ここで自動入力を実現するために使用されるのはe x p e c t expect expect部分であり、検出された場合(y e s/n o)?(yes/no)? (yes/no)? を選択すると、y e s yes yesが自動的に入力され、p a s s s w o r d:password:password:が検出されると、p a s s s w o r d passwordが自動的に入力されます.
また,s p a w n spawn spawn後二重引用符の内容は,s s h sshがリモートリンクしたサーバ上で実行するものであり,s u d o sudo sudo権限はパスワードを入力する必要があるため,e c h o echo echo方式でパスワードの自動入力を行う.
ここで言わざるを得ないのは、一般的なパスワードの自動入力方法は3つあるが、s s s h sshとs c p scp scpについては、e x p e c t expect expectでのみパスワードの自動入力操作が可能である.
xs c p xscp xscpスクリプト:
#!/usr/bin/expect -f
# Usage: expect xscp a b c

set timeout 10
set source [lindex $argv 0]
set target [lindex $argv 1]
set passwd [lindex $argv 2]

spawn scp $source $target

expect {
    "(yes/no)?" {
        send "yes
"
expect "password:" send "$passwd
"
} "password:" { send "$passwd
"
} } interact

もっと面白いシナリオは、大物たちの指摘を歓迎します.