Вы просто должны использовать:
echo {#cws[@]}
{#cws}
обычно используется для возврата длины строки[@]
важен, потому что без него значение $cws
не является всем массивом, вместо него по умолчанию используется первый элемент значения массива, он же $cws[0]
Например, в командной строке мы можем сделать простой трехэлементный массив, подобный вашему:
$ cws[0]="11"; cws[1]="2"; cws[3]="8"
Теперь посмотрите, что происходит, когда мы обращаемся только к $cws
:
$ echo $cws
11
Итак, при использовании расширения bash для определения длины чего-либо, {#
. .. }
, без [@]
, вы пишете ${#cws}
, $cws
это 11
, поэтому вы спрашиваете bash "какова длина 11"? и, конечно, bash смотрит на строку 11
, которая содержит два символа, поэтому Bash говорит: "О, это 2":
$ echo ${#cws}
2
Поэтому, чтобы уточнить, что вы имели в виду длину массива, вспомните [@]
:
$ echo ${#cws[@]}
3
Я не думаю, что 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
в /etc/ssh/ssh_config
, если она еще не включена, дает вам приемлемую скорость.
ПРЕДУПРЕЖДЕНИЕ :Шифрование arcfour
является ненадежным . НЕ запускайте это по незащищенным каналам. Если вас беспокоит доступ к серверу из незащищенных каналов с использованием шифрования arcfour
, измените etc/ssh/ssh_config
на хост -конкретную часть для исходного хоста -Создайте раздел Host
в вашей конфигурации ssh _для вашего исходного хоста вы можете использовать Ciphers arcfour
там, чтобы отразить указанный выше переключатель -c
, который ограничивает шифрование arcfour
только этим хостом.
Подробнее см. справочные страницы ssh_config
.
Однако, если ваши процессоры поддерживают набор инструкций AES -NI, попробуйте переключиться на aes128 -gcm@openssh.com (да, это имя шифра, включая @stuff ), который используйте невероятно быстрый (с AES -NI )AES128 -GCM.
Таким образом, если ЦП поддерживает AES -NI, измените "ssh -T -c arcfour -o Compression=no -x"
на "ssh -T -c aes128-gcm@openssh.com -o Compression=no -x"
для получения более безопасных результатов.
-z
, это намного медленнее)a
:режим архива -рекурсивный, сохраняет владельца, сохраняет разрешения, сохраняет время модификации, сохраняет группу, копирует символические ссылки как символические ссылки, сохраняет файлы устройств. H
:сохраняет жесткие -ссылки A
:сохраняет списки ACL X
:сохраняет расширенные атрибуты x
:не пересекать файл -границы системы v
:увеличить детализацию --numeric-ds
:не сопоставлять значения uid/gid по имени пользователя/группы --delete
:удалить посторонние файлы из целевых каталогов (дифференциальную очистку -во время синхронизации)--progress
:показать прогресс во время передачи T
:отключите псевдо -tty, чтобы уменьшить нагрузку на процессор в пункте назначения. c arcfour
:используйте самое слабое, но самое быстрое шифрование SSH. Необходимо указать «Ciphers arcfour» в конфигурации sshd _на месте назначения. 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
Сначала несколько заметок:
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
). Как и все глобусы, он исключает скрытые файлы, поэтому будьте осторожны, могут быть и другие файлы, которые он исключает. Здесь, чтобы избежать проблем с поиском правильного синтаксиса для удаленной оболочки, вы можете фактически указать этой другой оболочке запустить нужную оболочку и передать ей код через стандартный ввод (один из параметров, перечисленных в Как выполнить произвольную простую команду через 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
для zsh
, ~/.cshrc
для csh
, ~/.bashrc
дляbash
).
POSIXly (хотя на практике вы можете обнаружить, что больше систем имеют команду bash
, чем команду pax
), вы могли бы:
ssh host sh << 'EOF'
cd srcdir && pax -rw -'s|^\.//\./subdir\(/.*\)\{0,1\}$||'.//. /path/to/destdir/
EOF
-s
применяет замены к передаваемым путям. Когда эта замена превращается в ничто, файл исключается.Проблема в том, что замены также применяются к цели символических ссылок. Вот почему мы используем .//.
выше, чтобы снизить вероятность воздействия на символическую ссылку.
Согласно моим расчетам, самая быстрая полная копия всегда использует «tar» (здесь, предполагая, что GNU tar
или совместимый ).
mkdir -p photos2 &&
tar -C photos -cf - --exclude=./.thumbcache. |
tar -C photos2 -xpf -
И tar
имеет массу опций для управления атрибутами, разрешениями и выбором/исключением файлов. Например, приведенная выше команда исключает вложенную папку верхнего уровня с именем.thumbcache при копировании.