ZenityウィンドウにSCPの進行状況を表示する


0

リモートサーバーからローカルマシンへのいくつかのファイルのscp転送の進行状況をグラフィカルに表示したいと思います。

たとえば、Zenityの使用を考えました。ネットを閲覧すると、コマンドpvを使用してこれを実行できることがわかりました。

そんな感じ:

(
scp user@remote:/home/folder/* . | pv -n -b -s $totalSize
) | zenity --progress --title="Transfer window" --percentage=0 --auto-close

しかし、これは機能しません。

rsyncを使用することもできます。

何か案が?

ありがとう。

回答:


0

あなたの問題は、zenityが数字とコメントを1行ずつ期待しているという事実にあります。「-b」フラグを使用してさらに送信します。削除してから再試行してください。

Zenityは、標準入力から行ごとにデータを読み取ります。行の先頭に#が付いている場合、テキストはその行のテキストで更新されます。行に数字のみが含まれている場合、パーセンテージはその数字で更新されます。

参照:Zenityのドキュメント

SCPを単独で使用する

さて、あなたはある種の進歩的な見方を持ちたいようです。トリックを実行するscpの冗長フラグを試してみます。

scp -v user@remote:/home/folder/* .

あなたがそこで何を達成しようとしているのかわかりませんが、コピーコマンドと圧縮にサブフォルダを含めて、転送時間を短縮することができます:

scp -vrC user@remote:/home/folder/* .

Rsyncを使用する

私があなただったら、そのためにrsyncを使用します。これはインクリメンタルコピーを作成し、アクセス許可や時間を保持するなどの多くのものを作成します。私がいつも使っているいくつかのコマンドは次のとおりです。

ローカルファイルを削除せずに増分コピー

rsync -avz --progress user@remote:/home/folder/ ./

両方のディレクトリのミラーを作成する増分コピー、リモートサーバーに存在しないファイルの削除

rsync -avz --delete --progress user@remote:/home/folder/ ./

-1

残念ながら、stdoutが端末でない場合、scpは進行状況を表示しません。

次の2つのオプションがあります。

オプション1は、端末ではないstdoutを無視するようにscpコードを変更します。ソースをダウンロード(http://www.openssh.com/から)

scp.c:main()の次のコードをコメントします

if (!isatty(STDOUT_FILENO))
    showprogress = 0;

オプション2ラッパーを使用してscpを欺いて、端末があると考えます。

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

main(int argc, char **argv) {
 int fd;
 pid_t pid;
 char c,c1,c2;

 if (argc != 3) {
  printf("usage: [[user@]host1:]file1 [[user@]host2:]file2\n\nThis is a program that wraps scp and prints out the numeric progress on separate lines.\n");
  fflush(stdout);
  _exit(1);
 }

 pid = forkpty (&fd, NULL, NULL, NULL);
 if (pid == 0) {
  execlp ("scp", "scp", argv[1], argv[2], (char *) NULL);
  _exit (1);
 } else if (pid == -1) {
  return 1;
 } else {
  FILE *F;

  F = fdopen (fd, "r");

  //reading character by character isn't horribly efficient...
  while((c = fgetc(F)) != -1) {
   if (c == '%') {
    if (c1 == ' ')
     printf("%c\n", c2);  //one digit progess
    else if (c1 == '0' && c2 == '0')
     printf("100\n"); //done
    else
     printf("%c%c\n", c1,c2); //two digit progress
   }
   fflush(stdout);
   c1 = c2;
   c2 = c;                   
  }

 fflush (F);
 wait (0);
 }
 return 0;
} 

ラッパーをコンパイルしてscpに使用します

 $ ./scpwrap /home/ubuntu/somefile user@example.com:~ | zenity --progress

元のソリューションと詳細:http : //blog.clay.shep.me/2009/06/showing-scp-progress-using-zenity.html


ここのリンクから関連情報を含めることができますか?
ベルティエブ

解決策は、説明する短いものではありません。投稿の著者は説明の素晴らしい仕事をしました。私は説明しようとすることができますが、リンクを訪問することをお勧めします。
ヴァムシ

リソースと同様に、それはいつでも変更/消失する可能性があるため、ここに情報を含めるより多くの理由とリンクのみの回答はいずれの場合も推奨されません。
ベルティエブ

なるほど。情報ありがとう。私が貢献する答えがあれば、私はおそらく将来貢献するでしょう。この質問については、ソリューションをコピーして貼り付けることをお勧めしますか?新しい貢献者として、私は落胆する解決策を指し示すために負のスコアを見つけます。
Vamsi

私はあなたに投票しなかったので、なぜ彼らがそれをしたのかあなたに話すことができません。しかし、あなたの質問に対処するには:記事全体をコピーして貼り付けるのは適切ではありませんが、部分を引用して他の部分を要約することは適切です。
ベルティエブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.