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

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

スクリプトを使用して、いくつかの .deb パッケージの展開を自動化しようとしています。SSHsudo dpkg -i $myDeb.debでアクセスできるリモート マシンのリストで実行したいと考えています。

私は、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(s) し、次に sudo dpkg をローカルで実行します。これは 2 つの別々のコマンドのようです)

これとともに:

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

同様の問題に対して私が使用しているのは、すべてのリモート スクリプトを というファイルに入れることです/usr/local/bin/debinstall.sh。あなたのケースで私が提案するのは、パッケージをドロップする特別なディレクトリを用意することです/tmp/remoteinstall。例として、これを と呼びます。さらに、接続するユーザーをファイルに入れて/etc/suduers、パスワードを要求されずに実行できるようにしますsudo dpkg -i *debinstall.sh次のようになります。

#!/bin/bash
cd /tmp/remoteinstall
sudo dpkg -i *.deb && rm -f *

このスクリプトを および が所有するようにしますchmod 744 /usr/local/bin/debinstall.sh

ローカルでは、.deb ファイルをアップロードしてスクリプトを呼び出すだけです。

cd /path/to/files
scp * user@remotemachine:/tmp/remoteinstall
ssh user@remotemachine /usr/local/bin/debinstall.sh

debinstall.shその後、パッケージをインストールし、その後ディレクトリを空にしますインストールが正常に完了した場合のみ

に何かが欠けている場合は$PATH、 も もこの方法では実行されないことに注意してください.bashrc.profileそのため、リモート スクリプトの先頭でそれらをソースするか、そこに適切な PATH を定義する必要があります。

関連情報