Как отправить несколько команд в sftp использование одной строки

Полное раскрытие: Я - один из авторов и текущего специалиста по обслуживанию eCryptfs утилит пространства пользователя.

Большой вопрос!

Linux имеет максимальную длину имени файла 255 символов для большинства файловых систем (включая EXT4), и максимальный путь 4 096 символов.

eCryptfs является многоуровневой файловой системой. Это складывает сверху другой файловой системы, такой как EXT4, который на самом деле используется для записи данных в диск. eCryptfs всегда шифрует содержание файла, но он может дополнительно зашифровать (затеняют) имена файлов (или не).

Если имена файлов не шифруются, то можно безопасно записать имена файлов до 255 символов и зашифровать их содержание, поскольку имена файлов, записанные в более низкую файловую систему, будут просто соответствовать. В то время как взломщик не смог бы считать содержание index.html или budget.xls, они знали бы, какие имена файлов существуют. Это может (или не может) пропускать уязвимую информацию в зависимости от Вашего варианта использования.

Если имена файлов шифруются, вещи становятся немного более сложными. eCryptfs предварительно ожидает немного данных по передней стороне зашифрованного имени файла, такого, что это может определить зашифрованные имена файлов окончательно. Кроме того, само шифрование включает "дополнение" имени файла.

Например, у меня есть зашифрованный файл, ~/.bashrc. Это имя файла шифруется с помощью моего ключа к:

/home/kirkland/.Private/ECRYPTFS_FNEK_ENCRYPTED.dWek2i3.WxXtwxzQdkM23hiYK757lNI7Ydf0xqZ1LpDovrdnruDb1-5l67.EU--

Очевидно, то, что 7 символьных имен файла теперь требуют, чтобы были зашифрованы больше чем 7 символов. Опытным путем мы нашли, что символьные имена файлов дольше, чем 143 символа начинают требовать> 255 символов шифровать. Таким образом, мы (как eCryptfs восходящие разработчики) обычно рекомендуем ограничить имена файлов ~140 символами.

Теперь, однако, NAS Synology является коммерческим продуктом, который встраивает и использует eCryptfs и Linux, чтобы зашифровать и защитить данные по устройству. Мы (восходящие разработчики eCryptfs) не имеем никакого отношения к Synology или их продуктам, хотя мы обычно рады видеть eCryptfs, используемый в дикой природе. Мне кажется, что их рекомендация 45 символов является любой типографской ошибкой (из наших 140 символьных рекомендаций), или просто намного более осторожная оценка.

13
09.11.2012, 01:09
6 ответов

От здесь-строки (<<<) синтаксис, который Вы использовали, я предполагаю, что Ваша оболочка bash, таким образом, можно также использовать строку с оставленными из обратной косой черты символами ($''):

sftp -o PasswordAuthentication=no user@host <<< $'lcd /home\n cd /myhome\n get file'

Портативная альтернатива является здесь-документом:

sftp -o PasswordAuthentication=no user@host <<END
lcd /home
cd /myhome
get file
END
12
27.01.2020, 19:52
  • 1
    <<< был представлен сначала zsh (хотя вдохновлено rc) и был позже добавлен к ksh93, и затем колотите. –  Stéphane Chazelas 09.11.2012, 00:34
  • 2
    Спасибо, @StephaneChazelas. Я действительно должен усилить мой zsh навыки. А-ч –  manatwork 09.11.2012, 10:49

Используйте -b/--batchfile опция иметь надлежащую обработку ошибок:

 printf '%s\n' 'lcd /home' 'cd /myhome' 'get file' | sftp -b - user@host
8
27.01.2020, 19:52
  • 1
    использовать изменение переменных '" –  Radnaskela Samot 09.11.2012, 10:43

Да, можно просто использовать echo -e

echo -e "lcd /home\ncd /myhome\nget file" | sftp user@host
2
27.01.2020, 19:52
  • 1
    сигнала echo очень нестандартно - echo -e не работает то же везде, таким образом, необходимо было бы проверить сначала. С другой стороны, просто используйте printf который является намного более портативным и должен работать то же везде. –  jw013 08.11.2012, 18:59

Используйте собственную команду sftp

sftp-o PasswordAuthentication=no user@host:/home/myhome/file

0
27.01.2020, 19:52

Необязательно избегать параметра -b , чтобы избежать записи командного файла на диск. Используя замещение процесса , вы можете создать пакет "на лету".

batch() {
  echo lcd /home
  echo cd /myhome
  echo get file
}

sftp -b <(batch) -o PasswordAuthentication=no user@host
1
27.01.2020, 19:52

Mybru, ты можешь передавать свои команды вот так:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
0
27.01.2020, 19:52

Теги

Похожие вопросы