SSH + Sudo + Bashスクリプトの予想:リモートシステムでsudoを使用してコマンドを実行する

SSH + Sudo + Bashスクリプトの予想:リモートシステムでsudoを使用してコマンドを実行する

スクリプトを使用していくつかの.debパッケージの配布を自動化したいと思います。sudo dpkg -i $myDeb.debSSH経由でアクセスできるリモートコンピュータのリストから実行したいです。

Bashスクリプトで "expect"を使用してコマンドを自動化しようとしていますが、さまざまなエラーが発生し、明らかに何かが間違っているようです(デフォルトでは引用符が置かれた場所によって異なります)。

これは私が持っている関数です(次のように呼び出されます:_remoteInstallation "myPackage115.deb" "192.168.1.55".リモートシステムでは、.debが$ HOME / Documents /にあることを知っています:

function _remoteInstallation(){
    local retval=1
    local debToInstall=$(basename "$1")
    local remoteMachine="$2"
    spawned=$(expect -d -c "
          set timeout 1800
          spawn "/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall"'
          expect {
                \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue }
                \"password\" { send \"myPassword\r\";  exp_continue }
                \"[sudo] password\" { send \"myPassword\r\";  exp_continue }
                default { exit 1 }
          }
    " )
    retval=$?
    return $retval
}

このように作成された領域に引用符を使用すると、次のような結果が得られます。

expect: invalid option -- 't'

私がそれを次のように変更した場合:

 spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'

sudo dpkgコマンドをローカルで実行しようとしているようです(まず、「$ remoteMachine」でsshを実行してから、2つの別々のコマンドのようにローカルでsudo dpkgを実行します)。

これで:

spawn '/usr/bin/ssh -t borrajax@$remoteMachine \'/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\''

わかりましたcouldn't execute "'/usr/bin/ssh": no such file or directory(事実ではありません)

...今はアイデアが足りません...:-)

どんなアドバイスも本当にありがとうございます。ありがとうございます。

ベストアンサー1

私はあなたが特定のレベルの引用エスケープを見逃していると思います。この種の高レベルのエスケープでは、引用すべき各ステップに対して簡単なスクリプトを作成するのが最善です。

それ以外の場合は、この修正版を試すことができます(ただし、このコーディングスタイルはお勧めできません!)。

function _remoteInstallation(){
    local retval=1
    local debToInstall=$(basename "$1")
    local remoteMachine="$2"
    spawned=$(expect -d -c "
          set timeout 1800
          spawn \"/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\"
          expect {
                \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue }
                \"password\" { send \"myPassword\r\";  exp_continue }
                \"[sudo] password\" { send \"myPassword\r\";  exp_continue }
                default { exit 1 }
          }
    " )
    retval=$?
    return $retval
}

おすすめ記事