Подтвердить что ты не робот

Как я могу scp файл с двоеточием в имени файла?

Я пытаюсь скопировать файл с помощью scp в bash с символом двоеточия (:) в исходном имени файла. Обфускационная версия моей команды, которую я использую, это:

scp file\:\ name.mp4 [email protected]:"/path/to/dest"

Я получаю эту ошибку:

ssh: Could not resolve hostname Portal 2: Name or service not known

Я знаю, что могу просто переименовать файл и удалить :, но я хотел бы знать, возможно ли избежать двоеточия.

4b9b3361

Ответ 1

Не совсем проблема с экранированием bash, она scp обрабатывает x: как префикс [user @] хоста, попробуйте:

scp ./file:\ name.mp4 [email protected]:"/path/to/dest"

Использование относительных (например, ./) или полностью определенных путей (/path/to/source) предотвращает это поведение - наличие / до : заставляет OpenSSH прекратить проверку возможных host: или [email protected]: префикс). OpenSSH scp только имена файлов особых случаев, которые начинаются с двоеточия, позволяя этим работать без проблем, не имеют поддержки для ускорения : в нормальном смысле и не имеют другого представления о допустимых именах хостов, поэтому почти любое имя файла с : может вызвать это.

(Из-за упрощенного анализа OpenSSH адресов [] с закрытыми адресами IPv6 вы можете успешно scp файлы, содержащие :, которые начинаются с [ или содержат @[ до : и не содержат ]:, но это обычно не полезно; -)


( Приведенный ниже текст был написан, когда оригинальный вопрос: Как избежать двоеточия в bash? Это относится к этому ситуации, но не до scp, поскольку никакое количество экранирования оболочки не поможет там.)

Чтобы ответить на вопрос о том, как избежать :, вам не нужно, но работает "\:". Места, в которых используется ::

  • нулевая команда :, не нужно бежать, хотя вы можете, просто как \e\c\h\o foo, она не влияет на команду ( "no effect" не полностью прав, если вы избежите одного или нескольких символов, это будет предотвратить совпадение псевдонима)
  • PATH (и другие, CDPATH, MAILPATH), избегая значений, не имеет никакого полезного эффекта (я не смог запустить программу в своем PATH из каталога, содержащего :, что немного неожиданный)
  • расширение параметра ${name:-x} и более, name должно быть [a-zA-Z_][a-zA-Z0-9_], поэтому не нужно избегать имен переменных, и поскольку нет никакой двусмысленности, нет необходимости избегать последующих : в других вариантах расширения параметров
  • ? : trinary работает только с переменными и числами, не нужно бежать
  • == и =~ с классами в шаблоне, например [[:digit:]], вы можете выйти с помощью \:, но я не понимаю, как это может быть полезно...
  • в именах команд или функций, не нужно бежать, \: не имеет никакого полезного эффекта

(Обратите внимание, что нулевая команда просто :, вы можете иметь команду или функцию с именем ":foo" и ее можно вызывать без экранирования, в этом отношении она отличается от #, где команда с именем #foo должен быть экранирован.)