(를 ssh
통해 사용해야합니다 .Ruby
네트워크/SSH)는 폴더를 반복적으로 복사하고 하위 폴더를 제외합니다. 나는 이 작업을 수행하는 가장 빠른 방법을 찾고 있으므로 rsync
아니요. 또한 ssh
대신 .sh
bash
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
그대로 실행되지만 일부 확장은 호환성을 위해 비활성화됩니다.sh
bash
SSH 서버는 에 지정된 대로 사용자의 로그인 셸을 시작합니다 /etc/passwd
. 셸을 변경하거나 이를 사용하여 필요에 더 적합한 다른 셸을 시작할 수 있습니다.
답변3
먼저 몇 가지 참고 사항:
- ssh 서버는
sh
클라이언트가 보낸 명령줄을 해석하기 시작하지 않으며 원격 호스트에서 사용자의 로그인 셸을 실행합니다that-shell -c <the-string-provided-by-the-client>
. 원격 사용자의 로그인 셸은 무엇이든 가능합니다. 일부 셸에는tcsh
.fish
rc
sh
- 실제로는 명령줄이거나 오히려 문자열입니다(개행 문자를 포함할 수 있으므로 여러 줄이 있습니다).
ssh host cmd arg1 'arg 2'
wherecmd
,arg1
및arg 2
3개의 매개변수가 에 전달된 경우에도 해당 매개변수ssh
를ssh
공백으로 연결하고 실제로cmd arg1 arg 2
문자열을 에 보내며sshd
, 원격 셸은 이를cmd
,arg1
및 로 분할합니다.arg
2
!(subdir)
glob 연산자입니다(ksh
또한 glob 연산자도 지원합니다). 모든 glob과 마찬가지로 숨겨진 파일을 제외하므로 다른 파일도 제외할 수 있다는 점에 유의하세요.zsh -o kshglob
bash -O extglob
여기에서 원격 셸에 대한 올바른 구문을 찾는 문제를 피하기 위해 실제로 다른 셸에 원하는 셸을 시작하고 stdin을 통해 코드를 제공하도록 지시할 수 있습니다(in원격 사용자의 로그인 셸을 모르고 SSH를 통해 임의의 간단한 명령을 어떻게 실행할 수 있습니까?)
ssh host 'bash -O extglob -O dotglob' << 'EOF'
cp -r srcdir/!(subdir) dstdir/
EOF
bash -O extglob -O dotglob
Bourne과 같은 쉘, csh, rc, fish...를 포함한 모든 주요 쉘에서 이해할 수 있는 명령줄입니다. bash
사용자의 $PATH
(기본값 $PATH
, 사용자가 수정할 수 있음) 로그인 쉘 에 설치되고 위치하는 한 , 위의 작업은 ~/.zshenv
for zsh
, ~/.cshrc
for csh
, ~/.bashrc
for 와 유사하게 작동합니다 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>
또한 arcfour
in(아직 활성화되지 않은 경우)으로 시작하는 줄에 암호화를 추가하면 허용 가능한 속도를 얻을 수 있습니다.Ciphers
/etc/ssh/ssh_config
경고: arcfour
암호화는불안정. 보안되지 않은 채널을 통해 이 프로그램을 실행하지 마십시오. arcfour
보안되지 않은 채널에서 서버에 액세스하기 위해 암호화를 사용하는 것이 걱정된다면 etc/ssh/ssh_config
다음을 사용하십시오 .호스트별소스 호스트에 대한 섹션 - 위의 스위치를 미러링하는 데 Host
사용할 수 있는 소스 호스트에 대해 ssh_config에 섹션을 생성합니다. 이는 암호화를 해당 호스트로만 제한합니다.Ciphers arcfour
-c
arcfour
자세한 내용은 매뉴얼 페이지를 참조하십시오 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