
スクリプトを使用して、いくつかの .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 を定義する必要があります。