残念ながら、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