Мне нужно запустить удаленный скрипт , используя с 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 ubuntu@X.X.X.X '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 ubuntu@X.X.X.X '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 `('
ssh
(хорошоsshd
) использует оболочку входа удаленного пользователя. Может быть что угодно.Ответы:
SSH запускает вашу оболочку входа в систему в удаленной системе, что бы это ни было. Но
!(foo)
требуетshopt -s extglob
, который вы, возможно, не установили на пульте.Попробуйте это, чтобы увидеть, если SSH запускает Bash на удаленной стороне:
Если это что-то печатает, но ваши сценарии запуска не установлены
extglob
, вы можете сделать это вручную с помощью команды, переданнойssh
:extglob
влияет на синтаксический анализ командной строки и вступает в силу только после новой строки, поэтому мы должны поместить туда буквальную новую строку, точки с запятой недостаточно.Также не то, что если вы избежите скобок с обратной косой чертой, они теряют свои особые свойства, как и любые другие символы глобуса. Это не то, что вы хотите сделать в этом случае.
источник
Я не знаю, почему вы думаете, что rsync будет медленным. Скорость копирования в основном определяется скоростью диска. Rsync имеет много опций для указания того, что вы хотите включить или исключить, поэтому он дает вам гораздо лучший контроль, чем глобализация оболочки.
Как говорится в руководстве по bash,
!(patter)
в bash распознается, только еслиextglob
установлено. В вашем примере вы не установилиextglob
. Кроме того,bash
запущен какsh
естьbash
, но отключит некоторые расширения для совместимости.Сервер SSH запустит оболочку входа пользователя, как указано в
/etc/passwd
. Вы можете либо изменить оболочку, либо использовать ее для запуска другой оболочки, которая лучше соответствует вашим потребностям.источник
time
.time cp -r mesh/!(constant) N
-> Реальные 1.04 иtime rsync -a mesh/ N --exclude=constant
-> Реальные 1.8sСначала несколько заметок:
sh
интерпретировать командную строку, отправляемую клиентом, он запускает оболочку входа пользователя на удаленный хост, какthat-shell -c <the-string-provided-by-the-client>
. Оболочка входа удаленного пользователя может быть любой. Имейте в виду , что некоторые оболочки нравитсяtcsh
,fish
илиrc
имеют очень разный синтаксис от таковогоsh
.ssh host cmd arg1 'arg 2'
гдеcmd
,arg1
иarg 2
есть три аргумента передаютсяssh
,ssh
объединяющее эти аргументы с пробелами и фактически отправляетcmd arg1 arg 2
строкуsshd
и удаленной оболочки разделит это вcmd
,arg1
,arg
и2
.!(subdir)
является глобальным оператором (ksh
глобальный оператор также поддерживаетсяzsh -o kshglob
иbash -O extglob
). Как и все глобусы, он исключает скрытые файлы, поэтому будьте осторожны, могут быть и другие файлы, которые он исключает.Здесь, чтобы избежать проблем с поиском правильного синтаксиса для удаленной оболочки, вы можете указать другой оболочке запустить нужную оболочку и передать ей код через stdin (один из вариантов, перечисленных в разделе Как выполнить произвольный простой команда через ssh, не зная логин оболочки удаленного пользователя? )
bash -O extglob -O dotglob
это командная строка, понимается то же самое со всеми основными оболочками, в том числе Борн, как те, CSH, RC, рыбы ... Выше будет работать до тех пор , какbash
установлен и находится в пользователя$PATH
( по умолчанию$PATH
, возможно , изменен пользователем х вход в оболочку, как с~/.zshenv
дляzsh
,~/.cshrc
дляcsh
,~/.bashrc
дляbash
).POSIXly (хотя на практике вы можете обнаружить, что больше систем имеют
bash
команду, чемpax
команду), вы можете сделать:-s
применяет замены к передаваемым путям. Когда эта замена расширяется до нуля, файл исключается. Проблема в том, что замены также применяются к цели символических ссылок. Вот почему мы используем.//.
выше, чтобы уменьшить вероятность воздействия на символическую ссылку.источник
Я не думаю, что
ssh
ограничивается использованиемsh
. Скорее, это зависит от того, что установлено в целевой системе, как настроен пользователь и какие оболочки разрешены/etc/shells
.Вы рассматривали
chsh
команду?источник
Если вы хотите сделать это быстро, вы можете посмотреть
rsync
с другим алгоритмом шифрования. Это дает вам возможность легко исключать и т. Д., Не жертвуя скоростью.rsync -aHAXxv --numeric-ids --progress -e "ssh -T -c arcfour -o Compression=no -x" user@<source>:<source_dir> <dest_dir>
вместе с добавлением
arcfour
шифрования в строку, начинающуюся сCiphers
in/etc/ssh/ssh_config
, если она еще не включена, дает приемлемую скорость.ВНИМАНИЕ:
arcfour
шифрование небезопасно . НЕ запускайте это по незащищенным каналам. Если вы обеспокоены тем, как получить доступ к серверу из ненадежных каналов с помощьюarcfour
шифрования, изменитьetc/ssh/ssh_config
с принимающей конкретной частью для вашего хоста источника - СоздатьHost
раздел в вашем ssh_config для вашего хоста источника, вы можете использоватьCiphers arcfour
там зеркало выше-c
переключателя, который ограничиваетarcfour
шифрование только этим хостом.За подробностями обращайтесь к
ssh_config
справочным страницам.Однако, если ваши процессоры поддерживают набор инструкций AES-NI, попробуйте переключиться на aes128-gcm@openssh.com (да, это имя шифра, включая @ stuff), который будет использовать невероятно быстрый (с AES-NI) AES128 -GCM.
Таким образом, с CPU с поддержкой AES-NI, изменение
"ssh -T -c arcfour -o Compression=no -x"
в"ssh -T -c aes128-gcm@openssh.com -o Compression=no -x"
течение более безопасных результатов.объяснение
Rsync
-z
, это намного медленнее)a
: режим архива - рекурсивный, сохраняет владельца, сохраняет разрешения, сохраняет время модификации, сохраняет группу, копирует символические ссылки как символические ссылки, сохраняет файлы устройств.H
: сохраняет жесткие ссылкиA
: сохраняет ACLX
: сохраняет расширенные атрибутыx
: не пересекайте границы файловой системыv
: увеличить многословие--numeric-ds
: не отображать значения uid / gid по имени пользователя / группы--delete
: удалить посторонние файлы из директорий dest (дифференциальная очистка во время синхронизации)--progress
: показать прогресс во время передачиSSH
T
: отключить псевдо-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"
часть, вы также можете получить эти скорости.Сравнение:
rsync -az
scp -Cr
rsync -a
sftp
scp -r
sftp -R 128 -B 65536
rsync -a -P -e "ssh -T -c arcfour -o Compression=no -x"
scp -r -c arcfour
sftp -oCiphers=arcfour
Источники :
https://gist.github.com/KartikTalwar/4393116
http://nz2nz.blogspot.com/2018/05/rsync-scp-sftp-speed-test.html
источник
cp -r
в удаленной системе, поэтому шифрование, используемое соединением SSH, на самом деле не имеет значения. В любом случаеarcfour
это считается довольно испорченным, и OpenSSH по умолчанию отключает его вместе с другими на сервере, начиная с версии 6.7 (2014-10-06) . В любом случае,ssh -o Ciphers='aes128-ctr'
дает мне около 90 МБ / с, что должно быть достаточно быстрым для канала 1 Гбит / с.Согласно моим расчетам, самая быстрая полная копия всегда использует 'tar' (здесь предполагается GNU
tar
или совместимый).И
tar
имеет множество опций для управления атрибутами, разрешениями и выбором / исключением файлов. Например, приведенная выше команда исключает подпапку верхнего уровня с именем .thumbcache при копировании.источник
--exclude=.thumbcache
исключает все эти.thumbcache
файлы, а не только один на верхнем уровне. С GNUtar
(неbsdtar
), вы можете использовать--exclude=./.thumbcache
только для исключения.thumbcache
файла верхнего уровня .