3

自分で試してみましたが、スクリプトがリモートマシンにログインすると、スクリプトが停止します。これは、リモートマシンがスクリプトを認識していないため理解できますが、実行できますか?

ありがとう

4

6 に答える 6

5

ヒアドキュメントを試す

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'
于 2012-12-31T15:20:03.090 に答える
2

複数の方法があります。

  1. ssh user@remote < script.txt
  2. scp スクリプト user@remote:/tmp/somescript.sh ; ssh user@remote /tmp/somescript.sh
  3. 期待 スクリプトを書きます。

最初の 2 つのオプションについては、自動化のために、ログインに公開鍵と秘密鍵のペアを使用することをお勧めします。

于 2012-12-31T13:43:35.983 に答える
1

そのような場合、私は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、および終了ステータスをキャプチャする際の制御が向上します。

于 2012-12-31T13:39:28.243 に答える
1

ssh 呼び出しの最後にリモート コマンドを指定する必要があります。

$ ssh user@remote somecommand

一連のコマンドを実行する必要がある場合は、スクリプトを作成し、それをリモート マシンにコピーして (たとえば を使用scp)、上記のように呼び出す方が簡単です。

于 2012-12-31T12:59:03.040 に答える
0

あなたの~/.profile(または~/.bash_profileたとえば)のこのようなものは、トリックを行う必要があります:

function remote {
    ssh -t -t -t user@remote_server "$*'"
}

そして電話する

remote somecommandofyours
于 2012-12-31T13:05:28.940 に答える
0

この問題は、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 への参照が変数の値に置き換えられます。

乾杯!

于 2013-04-04T16:32:40.173 に答える