비교하다:

비교하다:

(를 ssh통해 사용해야합니다 .Ruby네트워크/SSH)는 폴더를 반복적으로 복사하고 하위 폴더를 제외합니다. 나는 이 작업을 수행하는 가장 빠른 방법을 찾고 있으므로 rsync아니요. 또한 ssh대신 .shbash

Bash에서는 다음을 수행합니다.

cp -r srcdir/!(subdir) dstdir

그리고 그것은 훌륭하게 작동합니다. 그러나 다음을 ssh통해 스크립트를 시작하면

sh: 1: Syntax error: "(" unexpected

사용되고 있기 때문입니다 sh.

매뉴얼 페이지를 확인했지만 sh파일을 제외하는 옵션이 없습니다.

ssh이것이 sh내가 사용하고 있는 올바른 가정인가요? 대체 제안이 있습니까?

편집 1: 작동하는 경우 출력은 sudo cat /etc/shells다음과 같습니다.

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen

편집 2: 좋아요 따라서 bash를 사용할 수 있으며 이는 문제가 되지 않는 것 같습니다. 실제로 ssh가 사용되고 있는 것을 확인했습니다 bash. 해당 문제는 괄호나 느낌표의 이스케이프와 관련된 것으로 보입니다. 쉘(macos)에서 명령을 실행해 보았는데 실제 명령은 다음과 같습니다.

ssh -i .ssh/key.pem [email protected] 'mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'

이렇게 하면 다른 오류가 발생합니다.

cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory

편집 3: 의견을 바탕으로 추가 명령을 변경했습니다.extglob

내가 사용한다면

ssh -i .ssh/key.pem [email protected] 'shopt -s extglob; mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'

다음 오류가 발생합니다.

cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory

내가 괄호를 벗어나지 않으면 나는 얻는다.

bash: -c: line 0: syntax error near unexpected token `('

답변1

SSH는 원격 시스템이 무엇이든 원격 시스템에서 로그인 쉘을 실행합니다. 하지만 !(foo)필수이므로 shopt -s extglob리모컨에 설정하지 않았을 수도 있습니다.

SSH가 원격 측에서 Bash를 실행하는지 확인하려면 다음을 시도하십시오.

ssh me@somehost 'echo "$BASH_VERSION"'

인쇄되는 항목이 있지만 시작 스크립트가 설정되지 않은 경우 extglob다음에 전달된 명령을 기반으로 수동으로 수행할 수 있습니다 ssh.

ssh me@somehost 'shopt -s extglob
    echo srcdir/!(subdir)'                                 
 # or
ssh me@somehost $'shopt -s extglob\n echo srcdir/!(subdir)'   

extglob명령줄 구문 분석에 영향을 미치고 줄 바꿈 이후에만 적용되므로 거기에 리터럴 줄 바꿈을 넣어야 하며 세미콜론으로는 충분하지 않습니다.

ssh me@somehost 'shopt -s extglob; echo srcdir/!(하위 디렉토리)'

마찬가지로, 백슬래시를 사용하여 괄호를 이스케이프하면 다른 전역 문자와 마찬가지로 특수 속성이 손실됩니다. 이 경우에는 원하는 작업이 아닙니다.

$ touch foo bar; shopt -s extglob; set +o histexpand
$ echo *
bar foo
$ echo !(foo)
bar
$ echo \*
*
$ echo !\(foo\)
!(foo)

답변2

왜 rsync가 느릴 것이라고 생각하는지 모르겠습니다. 복사 속도는 주로 디스크 속도에 따라 달라집니다. Rsync에는 포함하고 제외할 항목을 지정하는 다양한 옵션이 있으므로 셸 와일드카드보다 더 효과적으로 제어할 수 있습니다.

bash 매뉴얼에 명시되어 있듯이 bash는 설정될 때까지 !(patter)이를 인식하지 못합니다 . extglob귀하의 경우 설정이 없습니다 extglob. 또한 은 bash그대로 실행되지만 일부 확장은 호환성을 위해 비활성화됩니다.shbash

SSH 서버는 에 지정된 대로 사용자의 로그인 셸을 시작합니다 /etc/passwd. 셸을 변경하거나 이를 사용하여 필요에 더 적합한 다른 셸을 시작할 수 있습니다.

답변3

먼저 몇 가지 참고 사항:

  • ssh 서버는 sh클라이언트가 보낸 명령줄을 해석하기 시작하지 않으며 원격 호스트에서 사용자의 로그인 셸을 실행합니다 that-shell -c <the-string-provided-by-the-client>. 원격 사용자의 로그인 셸은 무엇이든 가능합니다. 일부 셸에는 tcsh.fishrcsh
  • 실제로는 명령줄이거나 오히려 문자열입니다(개행 문자를 포함할 수 있으므로 여러 줄이 있습니다). ssh host cmd arg1 'arg 2'where cmd, arg1arg 23개의 매개변수가 에 전달된 경우에도 해당 매개변수 sshssh공백으로 연결하고 실제로 cmd arg1 arg 2문자열을 에 보내며 sshd, 원격 셸은 이를 cmd, arg1및 로 분할합니다.arg2
  • !(subdir)glob 연산자입니다( ksh또한 glob 연산자도 지원합니다). 모든 glob과 마찬가지로 숨겨진 파일을 제외하므로 다른 파일도 제외할 수 있다는 점에 유의하세요.zsh -o kshglobbash -O extglob

여기에서 원격 셸에 대한 올바른 구문을 찾는 문제를 피하기 위해 실제로 다른 셸에 원하는 셸을 시작하고 stdin을 통해 코드를 제공하도록 지시할 수 있습니다(in원격 사용자의 로그인 셸을 모르고 SSH를 통해 임의의 간단한 명령을 어떻게 실행할 수 있습니까?)

ssh host 'bash -O extglob -O dotglob' << 'EOF'
cp -r srcdir/!(subdir) dstdir/
EOF

bash -O extglob -O dotglobBourne과 같은 쉘, csh, rc, fish...를 포함한 모든 주요 쉘에서 이해할 수 있는 명령줄입니다. bash사용자의 $PATH(기본값 $PATH, 사용자가 수정할 수 있음) 로그인 쉘 에 설치되고 위치하는 한 , 위의 작업은 ~/.zshenvfor zsh, ~/.cshrcfor csh, ~/.bashrcfor 와 유사하게 작동합니다 bash.

POSIXly(실제로는 bash하나보다 하나의 명령을 갖는 시스템이 더 많다는 것을 알 수 있지만 pax) 다음을 수행할 수 있습니다.

ssh host sh << 'EOF'
cd srcdir && pax -rw -'s|^\.//\./subdir\(/.*\)\{0,1\}$||' .//. /path/to/destdir/
EOF

-s전송되는 경로에 대체를 적용합니다. 대체 확장자가 비어 있으면 파일이 제외됩니다. 문제는 교체가 심볼릭 링크 대상에서도 작동한다는 것입니다. 이것이 바로 우리가 .//.위의 방법을 사용하여 심볼릭 링크가 영향을 받을 가능성을 줄이는 이유입니다.

답변4

더 빠른 방법으로 이 작업을 수행하려면 rsync다른 암호화 알고리즘을 사용하는 것이 좋습니다. 이를 통해 너무 많은 속도를 희생하지 않고도 쉽게 제외할 수 있는 옵션이 제공됩니다.

rsync -aHAXxv --numeric-ids --progress -e "ssh -T -c arcfour -o Compression=no -x" user@<source>:<source_dir> <dest_dir>

또한 arcfourin(아직 활성화되지 않은 경우)으로 시작하는 줄에 암호화를 추가하면 허용 가능한 속도를 얻을 수 있습니다.Ciphers/etc/ssh/ssh_config

경고: arcfour암호화는불안정. 보안되지 않은 채널을 통해 이 프로그램을 실행하지 마십시오. arcfour보안되지 않은 채널에서 서버에 액세스하기 위해 암호화를 사용하는 것이 걱정된다면 etc/ssh/ssh_config다음을 사용하십시오 .호스트별소스 호스트에 대한 섹션 - 위의 스위치를 미러링하는 데 Host사용할 수 있는 소스 호스트에 대해 ssh_config에 섹션을 생성합니다. 이는 암호화를 해당 호스트로만 제한합니다.Ciphers arcfour-carcfour

자세한 내용은 매뉴얼 페이지를 참조하십시오 ssh_config.

그러나 CPU가 AES-NI 명령 세트를 지원하는 경우 다음으로 전환해 보십시오.[이메일 보호됨](예, @ 항목을 포함한 암호 이름입니다.) 매우 빠른(AES-NI 사용) AES128-GCM을 사용합니다.

따라서 CPU가 AES-NI를 지원하는 경우 "ssh -T -c arcfour -o Compression=no -x"더 안전한 결과를 위해 AES-NI로 변경하십시오."ssh -T -c [email protected] -o Compression=no -x"

설명하다

동기화

  • (사용하지 마세요 -z. 속도가 훨씬 느립니다.)
  • a:아카이브 모드 - 재귀, 소유자 보존, 권한 보존, 수정 시간 보존, 그룹 보존, 심볼릭 링크를 심볼릭 링크로 복사, 장치 파일 보존.
  • H: 하드 링크 유지
  • A: ACL 유지
  • X: 확장된 속성을 유지합니다.
  • x: 파일 시스템 경계를 넘지 마십시오.
  • v: 디테일의 수준을 높인다
  • --numeric-ds: 사용자/그룹 이름으로 uid/gid 값을 매핑하지 않습니다.
  • 동기화가 필요한 경우 추가 --delete: 대상 디렉터리에서 관련 없는 파일 제거(동기화 중 차이점 정리)
  • --progress: 전송 과정 중 진행 상황을 표시합니다.

SSH

  • T: 대상의 CPU 로드를 줄이려면 pseudo-tty를 끄세요.
  • c arcfour: 가장 약하지만 가장 빠른 SSH 암호화를 사용합니다. "Ciphers arcfour"는 대상의 sshd_config에 지정되어야 합니다.
  • o Compression=no: SSH 압축을 끕니다.
  • x: X 전달이 기본적으로 켜져 있으면 꺼주세요.

쇠고기는 옵션에 있습니다 . 및 부품 ssh만 사용하는 경우에도 이러한 속도를 얻을 수 있습니다 .rsync -av-e ssh -T -c arcfour -o Compression=no -x"


비교하다:

  • 13.6MB/초 rsync -az
  • 16.7MB/초 scp -Cr
  • 44.8MB/초 rsync -a
  • 59.8MB/초 sftp
  • 61.2MB/초 scp -r
  • 61.4MB/초 sftp -R 128 -B 65536
  • 62.4MB/초 rsync -a -P -e "ssh -T -c arcfour -o Compression=no -x"
  • 143.5MB/초 scp -r -c arcfour
  • 144.2MB/초 sftp -oCiphers=arcfour

원천:

https://gist.github.com/KartikTalwar/4393116

http://nz2nz.blogspot.com/2018/05/rsync-scp-sftp-speed-test.html

관련 정보