외부 명령을 실행할 때 Perl에서 큰 STDOUT 출력을 캡처하는 방법

user1919581

원격 위치에있는 파일 이름 목록을 얻고 싶습니다.

내 Perl 스크립트에서 아래 스 니펫을 사용하고 있습니다.

my $command = "sftp -q -o${transferAuthMode}=yes -oPort=$sftpPort ${remoteUsername}\@${remoteHost} 2>\&1 <<EOF\n" . 
       "cd \"${remotePath}\"\n" . 
       "ls -l \n" . 
       "quit\n" . 
       "EOF\n";

my @files = `$command`;

원격 위치의 파일 수가 많으면 (> 500) 모든 파일 이름이 @files.

수동으로 SFTP를 수행하고 파일을 나열하면 모든 파일이 나열되지만 스크립트를 통해 동일하게 표시되지 않습니다. 매번 @files크기가 달라집니다. 파일이 많은 경우에만 발생합니다.

그 이유를 찾을 수 없습니다. 도와 주 시겠어요?

User9102d82

이는 추가 패키지 모듈 없이도 가능합니다. CentOS 7 Server (Windows VM)에서 테스트했습니다.

내 원격 호스트 세부 정보 : 원격 호스트 디렉토리에 ~ 2000 개의 파일이 있습니다. CentOS 6.8 서버.

%_gaurav@[remotehost]:/home/gaurav/files/test> ls -lrth|head -3;echo;ls -lrth|tail -2
total 7.9M
-rw-rw-r--. 1 gaurav gaurav 35 Feb 16 23:51 File-0.txt
-rw-rw-r--. 1 gaurav gaurav 35 Feb 16 23:51 File-1.txt

-rw-rw-r--. 1 gaurav gaurav 38 Feb 16 23:51 File-1998.txt
-rw-rw-r--. 1 gaurav gaurav 38 Feb 16 23:51 File-1999.txt
%_gaurav@[remotehost]: /home/gaurav/files/test>

LocalHost의 스크립트 출력 : 명령을 실행하고 있다는 점에 유의하십시오 o${transferAuthMode}=yes. 아래에서 볼 수 있듯이 스크립트는 500 개 이상의 결과를 배열에 모두 수집 할 수 있습니다.

결과를 표시하기 위해 배열의 전체 항목, 특정 인덱스 번호를 prnting하고 있지만 주석 처리되지 않은 Dumper 줄로 시도하여 전체 결과를 확인합니다.

%_STATION@gaurav * /root/ga/study/pl> ./scp.pl
Read 2003 lines from SCP command.

ArrayIndex: 2,3,1999,2000 contain:

[-rw-rw-r--    0 501      501           36B Feb 16 23:51 File-58.txt]
[-rw-rw-r--    0 501      501           37B Feb 16 23:51 File-129.txt]
[-rw-rw-r--    0 501      501           38B Feb 16 23:51 File-1759.txt]
[-rw-rw-r--    0 501      501           38B Feb 16 23:51 File-1810.txt]
%_STATION@gaurav * /root/ga/study/pl>

스크립트 및 작업 :

#!/usr/bin/perl

use strict ;
use warnings ;
use Data::Dumper ;

my $sftp_port=22 ;
my ($user, $host) = ("gaurav","192.168.246.137") ;
my $remote_path = '/home/gaurav/files/test' ;

my @result ;    # To store result

my $command = "sftp -q -oPort=$sftp_port ${user}\@${host} 2>\&1 <<EOF\n"."cd $remote_path\nls -lrth\nquit\nEOF" ;

# open the command as a file handle, read output and store it.
open FH, "$command |" or die "Something went wrong!!\n" ;
while (<FH>) {
  tr/(?\r|\f|\n)//d ; # Removing any new line, carriage return or form feed.
  push(@result,"\[$_\]") ;
}
close FH ;

#print Dumper @result ;

# Just for printing a little bit of results from
# the array. Following lines can be deleted.
my $total = scalar @result ;
print "Read $total lines from SCP command.\n" ;
print "\nArrayIndex: 2,3,1999,2000 contain:\n
$result[2]
$result[3]
$result[1999]
$result[2000]
" ;

다른 방법 : 쉘 스크립트를 만들고 perl 스크립트에서 호출하여 출력을 읽어이 문제를 해결할 수도 있습니다. 아래와 같이 펄 스크립트와 최종 출력에 의해 호출되는 쉘 스크립트입니다. 이것은 perl에서 직접 명령을 작성 / 형식화 할 시간이 많지 않을 때 빠른 기술로 사용할 수 있습니다. 이전 스크립트에서도 qx 스타일 (아래 참조)을 사용할 수 있습니다 .

쉘 스크립트 "scp.sh"

%_STATION@gaurav * /root/ga/study/pl> cat scp.sh
#!/bin/bash

sftp -oPort=${1} ${2}@${3} 2>&1 <<EOF
cd ${4}
ls -l
quit
EOF

Perl 스크립트 "2scp.pl"

%_STATION@gaurav * /root/ga/study/pl> cat 2scp.pl
#!/usr/bin/perl

use strict ;
use warnings ;
use Data::Dumper ;

my $sftp_port=22 ;
my ($user, $host) = ("gaurav","192.168.246.137") ;
my $remote_path = '/home/gaurav/files/test' ;

# Passing arguements to shell script using concatination.
my $command = './scp.sh '." $sftp_port $user $host $remote_path" ;

my @result = qx{$command} ;     # Runs the command and stores the result.
my $total = scalar @result ;
print "Read $total lines from SCP command.\n" ;
# End.

산출:

%_STATION@gaurav * /root/ga/study/pl> ./2scp.pl
Read 2004 lines from SCP command.
%_STATION@gaurav * /root/ga/study/pl>

그것을 시도하고 알려주십시오. 감사.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

변수에서 명령의 출력을 캡처 할 때 개행 문자 (\ n)를 보존하는 방법

분류에서Dev

명령 프롬프트에서 프로그램을 실행할 때 콘솔 출력을 표시하는 방법

분류에서Dev

외부 명령 출력을 동시에 캡처하여 터미널에 인쇄하는 방법

분류에서Dev

PowerShell에서 외부 명령 진행 상황을 캡처하는 방법은 무엇입니까?

분류에서Dev

Python 스크립트 출력은 외부에서 호출하고 stdout / stderr을 파일에 로깅 할 때 실행이 끝날 때 나타납니다.

분류에서Dev

bash 스크립트에서 lynx를 실행할 때 명령을 출력하는 방법은 무엇입니까?

분류에서Dev

bourne 쉘 명령에서 출력을 캡처하는 방법

분류에서Dev

SSH : 원격에서 명령을 실행할 때 에코를 끄는 방법

분류에서Dev

큰 데이터 프레임을 처리 할 때 R에서 for 루프를 더 빠르게 실행하는 방법

분류에서Dev

paramiko로 명령을 실행할 때 stdout 출력이 목록에 저장되지 않습니다.

분류에서Dev

ifelse () 문 내부와 외부에서 줄을 실행할 때 다른 출력

분류에서Dev

외부 명령에 의한 비동기 처리 실행을 중지하는 방법

분류에서Dev

명령을 실행할 때 터미널 출력을 숨기는 방법은 무엇입니까?

분류에서Dev

명령을 실행할 때 터미널 출력을 숨기는 방법은 무엇입니까?

분류에서Dev

저지에서 streamoutput 응답을 사용할 때 이미 일부 출력을 플러시 한 후 예외를 처리하는 방법은 무엇입니까?

분류에서Dev

Bash : openssl 명령을 보내고 X 행을 볼 때 stdin에 스크립트 출력을하는 방법

분류에서Dev

stdout이 터미널이 아닐 때`ls -l` 명령을 실행할 때 개행 문자를 분리하는 방법

분류에서Dev

Node.js, 대 Electron :: 외부 명령을 실행하고 인터페이스에 stdout을 표시합니다.

분류에서Dev

PowerShell 명령에서 SQL을 실행할 때 로그인을 매개 변수화하는 방법

분류에서Dev

실행 된 명령에서 출력 줄 앞에 탭을 삽입하는 방법

분류에서Dev

jquery에서 외부를 클릭 할 때 입력을 저장하는 방법

분류에서Dev

AnyEvent 및 Perl을 사용하여 외부 명령을 병렬로 실행하는 방법

분류에서Dev

Perl에서 실시간으로 stdout 및 로그 파일에 출력을 복제하는 방법

분류에서Dev

조건부 실행을 사용할 때 Windows에서 종료 코드 이전 명령에 액세스하는 방법은 무엇입니까?

분류에서Dev

재부팅 / 재 로그인 할 때마다 Linux Mint 19 Cinnamon에서 "Keep NumLock always on"명령을 실행하는 방법은 무엇입니까?

분류에서Dev

원격으로 ssh 할 때 OSX에서 명령을 자동 실행하는 방법은 무엇입니까?

분류에서Dev

str ()을 사용할 때 출력 시작 부분에서 시작하는 방법

분류에서Dev

Docker 실행 명령 중에 볼륨을 마운트 할 때 거부 된 권한을 해결하는 방법은 무엇입니까?

분류에서Dev

../sdk/tools 폴더 외부에서 Android 명령을 실행하는 방법이 있습니까?

Related 관련 기사

  1. 1

    변수에서 명령의 출력을 캡처 할 때 개행 문자 (\ n)를 보존하는 방법

  2. 2

    명령 프롬프트에서 프로그램을 실행할 때 콘솔 출력을 표시하는 방법

  3. 3

    외부 명령 출력을 동시에 캡처하여 터미널에 인쇄하는 방법

  4. 4

    PowerShell에서 외부 명령 진행 상황을 캡처하는 방법은 무엇입니까?

  5. 5

    Python 스크립트 출력은 외부에서 호출하고 stdout / stderr을 파일에 로깅 할 때 실행이 끝날 때 나타납니다.

  6. 6

    bash 스크립트에서 lynx를 실행할 때 명령을 출력하는 방법은 무엇입니까?

  7. 7

    bourne 쉘 명령에서 출력을 캡처하는 방법

  8. 8

    SSH : 원격에서 명령을 실행할 때 에코를 끄는 방법

  9. 9

    큰 데이터 프레임을 처리 할 때 R에서 for 루프를 더 빠르게 실행하는 방법

  10. 10

    paramiko로 명령을 실행할 때 stdout 출력이 목록에 저장되지 않습니다.

  11. 11

    ifelse () 문 내부와 외부에서 줄을 실행할 때 다른 출력

  12. 12

    외부 명령에 의한 비동기 처리 실행을 중지하는 방법

  13. 13

    명령을 실행할 때 터미널 출력을 숨기는 방법은 무엇입니까?

  14. 14

    명령을 실행할 때 터미널 출력을 숨기는 방법은 무엇입니까?

  15. 15

    저지에서 streamoutput 응답을 사용할 때 이미 일부 출력을 플러시 한 후 예외를 처리하는 방법은 무엇입니까?

  16. 16

    Bash : openssl 명령을 보내고 X 행을 볼 때 stdin에 스크립트 출력을하는 방법

  17. 17

    stdout이 터미널이 아닐 때`ls -l` 명령을 실행할 때 개행 문자를 분리하는 방법

  18. 18

    Node.js, 대 Electron :: 외부 명령을 실행하고 인터페이스에 stdout을 표시합니다.

  19. 19

    PowerShell 명령에서 SQL을 실행할 때 로그인을 매개 변수화하는 방법

  20. 20

    실행 된 명령에서 출력 줄 앞에 탭을 삽입하는 방법

  21. 21

    jquery에서 외부를 클릭 할 때 입력을 저장하는 방법

  22. 22

    AnyEvent 및 Perl을 사용하여 외부 명령을 병렬로 실행하는 방법

  23. 23

    Perl에서 실시간으로 stdout 및 로그 파일에 출력을 복제하는 방법

  24. 24

    조건부 실행을 사용할 때 Windows에서 종료 코드 이전 명령에 액세스하는 방법은 무엇입니까?

  25. 25

    재부팅 / 재 로그인 할 때마다 Linux Mint 19 Cinnamon에서 "Keep NumLock always on"명령을 실행하는 방법은 무엇입니까?

  26. 26

    원격으로 ssh 할 때 OSX에서 명령을 자동 실행하는 방법은 무엇입니까?

  27. 27

    str ()을 사용할 때 출력 시작 부분에서 시작하는 방법

  28. 28

    Docker 실행 명령 중에 볼륨을 마운트 할 때 거부 된 권한을 해결하는 방법은 무엇입니까?

  29. 29

    ../sdk/tools 폴더 외부에서 Android 명령을 실행하는 방법이 있습니까?

뜨겁다태그

보관