自分で試してみましたが、スクリプトがリモートマシンにログインすると、スクリプトが停止します。これは、リモートマシンがスクリプトを認識していないため理解できますが、実行できますか?
ありがとう
ヒアドキュメントを試す
ssh user@remote << 'END_OF_COMMANDS'
echo all this will be executed remotely
user=$(whoami)
echo I am $user
pwd
END_OF_COMMANDS
「そこで何かを続けてください」と言うとき、リモートセッションとの単純な対話を意味するかもしれません:
expect -c 'spawn ssh user@host; interact'
そのような場合、私はperlを好みます:
use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
エラーが発生しにくくなり、コマンドの stdout、stderr、および終了ステータスをキャプチャする際の制御が向上します。
ssh 呼び出しの最後にリモート コマンドを指定する必要があります。
$ ssh user@remote somecommand
一連のコマンドを実行する必要がある場合は、スクリプトを作成し、それをリモート マシンにコピーして (たとえば を使用scp
)、上記のように呼び出す方が簡単です。
あなたの~/.profile
(または~/.bash_profile
たとえば)のこのようなものは、トリックを行う必要があります:
function remote {
ssh -t -t -t user@remote_server "$*'"
}
そして電話する
remote somecommandofyours
この問題は、declare -fを使用して ssh 経由で関数全体をリモート サーバーに渡し、そこで実行することで解決しました。これは実際には非常に簡単に行うことができます。唯一の注意点は、関数で使用されるすべての変数が関数内で定義されているか、引数として渡されていることを確認する必要があることです。関数が何らかの種類の環境変数、エイリアス、その他の関数、または外部で定義されたその他の変数を使用する場合、それらの定義が存在しないため、リモート マシンでは機能しません。
だから、ここに私がそれをした方法があります:
somefunction() {
host=$1
user=$2
echo "I'm running a function remotely on $(hostname) that was sent from $host by $user"
}
ssh $someserver "$(declare -f somefunction);somefunction $(hostname) $(whoami)"
関数が何らかの「グローバル」変数を使用する場合、sed または (私が好むように) perl を使用してパターン置換を行うことにより、declare 関数の後にこれらを置換できることに注意してください。
declare -f somefunction | perl -pe "s/(\\$)global_var/$global_var/g"
これにより、関数内の global_var への参照が変数の値に置き換えられます。
乾杯!