21

(scp を使用する) インストール スクリプトからの出力をキャプチャしてログに記録しようとしています。ただし、scp が出力するすべてのもの、つまりプログレス バーを取得していません。

画面出力:

/user2/cdb/builds/tmp/uat/myfiles/* をサーバー /users/myfiles に cdb としてコピーする

cdb@server のパスワード: myfile 100% |*****************************| 2503 00:00

ログ出力:

/user2/cdb/builds/tmp/uat/myfiles/* をサーバー /users/myfiles に cdb としてコピーする

私のファイルがそこにあることを本当に知りたいです。これが私が今無駄にしようとしているものです:

myscript.sh 2>&1 | ティー mylogfile.log

scp出力をキャプチャしてログに記録する良い方法はありますか?

ありがとう。

4

9 に答える 9

32

scpは、制御コードを使用してプログレスバーを端末に出力します。出力をリダイレクトして進行状況バーを省略したかどうかを検出します。

デフォルトでほとんどのディストリビューションにインストールされている「script」コマンドを使用して、scpをだましてターミナルで実行されていると思わせることで、これを回避できます。

script -q -c "scp server:/file /tmp/" > /tmp/test.txt

test.txtの内容は次のようになります。

file    0%    0     0.0KB/s   --:-- ETA
file   18%   11MB  11.2MB/s   00:04 ETA
file   36%   22MB  11.2MB/s   00:03 ETA
file   54%   34MB  11.2MB/s   00:02 ETA
file   73%   45MB  11.2MB/s   00:01 ETA
file   91%   56MB  11.2MB/s   00:00 ETA
file  100%   61MB  10.2MB/s   00:06

...これはおそらくあなたが望むものです。

インタラクティブスクリプトの出力をログファイルにリダイレクトしているときに、この問題に遭遇しました。終了コードはいつでも評価できるため、ログに結果がないことは問題ではありませんでした。しかし、私は本当にインタラクティブなユーザーにプログレスバーを見てもらいたかったのです。この答えは両方の問題を解決します。

于 2012-10-17T00:21:38.713 に答える
10

ログからscpが成功したかどうかを見逃しているようです。

スクロールバーがstdoutに出力されず、ncursesまたは他の種類のTUIを使用していると思いますか?

scpの戻り値を見るだけで、成功したかどうかを確認できます。好き

scp myfile user@host.com:. && echo success!

man scp言う

scp exits with 0 on success or >0 if an error occurred.
于 2008-10-14T19:21:37.187 に答える
1

たぶん、「スクリプト」を使用してターミナルセッションをログに記録できます。

于 2008-10-14T19:20:51.180 に答える
1
scp myfile user@host.com:. && echo success! 

非常に役に立ちますが、メッセージをログファイルに書き込むために、次のように変更しました

scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1

これにより、「myfile が正常にコピーされました!」と表示されます。ログファイルへのメッセージ。

于 2014-07-03T06:46:15.827 に答える
1

まだコメントできません:(なので、ここに更新を追加します...

@Martinは私にとって最良の解決策を持っていましたが、scpコマンドがスクリプトの途中にある場合、実際に後で実行されたコマンドの後に出力が表示される場合があります。

これは、スクリプトがサブシェルでコマンドを実行する必要があるためだと思いますが、まだテストしていません。

編集:実際にシェルを生成するため、(ビルド スクリプトのように) 順次実行する必要がある場合 (実際に失敗する場合) は、スクリプト コマンドの使用に関するロジックを追加する必要があります。

すなわち

script -q -c "あなたのコマンド" && sleep 1

または、親シェルが子シェルが終了するのを待ってから先に進むようにします。

于 2015-02-06T00:18:11.100 に答える
0

はい、私は最近、proc_open() から php スクリプト内で出力を取得しようとしていました。私のスクリプトへのこのジャンク出力

終了コードだけで仕事ができます:-)

$exit_code = proc_close($プロセス);

于 2009-08-12T03:06:36.680 に答える
0
$ grep -r "Error" xyz.out > abc.txt

上記のコマンドでは、出力をファイル abc.txt に保存しています。

このgrepコマンドは、エラーを含むテキストをファイルxyz.outで検索し、出力をコンソールに表示せずにabc.txtに保存するためのものです。

于 2016-05-31T12:31:38.567 に答える