Ваша удаленная сторона реализует SCP-протокол способом, который не совместим с OpenSSH-реализацией scp
которую вы обычно найдете на Linux или BSD-машине.
После прочтения кода из OpenSSH scp
, BSD rcp
и Putty pscp
(см. Ниже) кажется нормальным, что нужно пройтись по источникам, чтобы понять SCP. На этой заархивированной веб-странице написано:
Вы когда-нибудь задумывались, как работают команды scp и rcp? В первый раз я не нашел никакой документации по этому вопросу. Нет ни RFC, ни черновика, ни даже файла README, описывающего его. После прочтения исходного кода я попробовал еще раз и понял, что старая версия rcp.c может быть единственной доступной оригинальной документацией.
(Блог Яна Печанца: "Как работает протокол SCP", копия с 15 февраля 2017 г.)
Используя объяснение со страницы выше и вашу команду
scp -v user@xxx.xxx.xxx.xxx:/local/file/path /destination/path
Это означает, что вы копируете данные из удаленной системы (InterNiche scp
, которая находится в режиме "источника") в вашу систему (вероятно, OpenSSH scp
, в режиме "стока").
Однако удаленная система дает вам пути по нескольким каталогам во время обмена по протоколу SCP:
C0777 630 /home/random/sample.txt
<data of sample.txt>
в то время как ваш scp
может иметь дело только с чем-то вроде:
D0755 0 home
D0755 0 random
C0777 630 sample.txt
<data of sample.txt>
E
E
Решение состоит в том, чтобы проверить другую реализацию scp
в вашей локальной системе, или вместо этого попробовать sftp
:
sftp -q user@xxx.xxx.xxx.xxx:/remote/file/path /local/destination/path
Мой первоначальный ответ, позже обновленный:
Раковина: C0777 630 /home/random/sample.txt
Кажется, происходит от scp
.
Например, вы можете взглянуть на строку 969, которая является последней версией OpenSSH, используемой FreeBSD.
if (verbose_mode)
fmprintf(stderr, "Sink: %s", buf);
Перевод: если в подробном режиме отобразите сообщение «Sink:» со строкой, на которую указывает buf
Вы указали опцию -v.
Кажется, для отображения оставшегося буфера. C0777
похоже, команда BSD rcp
, см. Заголовок
* scp - secure remote copy. This is basically patched BSD rcp which
* uses ssh to do the data transfer (instead of using rcmd).
и строка 1023.
Вот этот
ошибка: неожиданное имя файла: /home/random/sample.txt
записывается строкой 1051:
if ((strchr(cp, '/') != NULL) || (strcmp(cp, "..") == 0)) {
run_err("error: unexpected filename: %s", cp);
exit(1);
Перевод: если строка, на которую указывает cp
содержит символ косой черты (/
) или равна строке ..
выведите сообщение об ошибке. Ваша строка имеет косую черту.
Кажется, что scp
не получает того, что ожидает от диалога с удаленным экземпляром ssh
.
Обновить:
Sink
- это противоположная часть вызова Source
. Здесь у нас есть другая сторона от реализации OpenSSH:
snprintf(buf, sizeof buf, "C%04o %lld %s\n",
(u_int) (stb.st_mode & FILEMODEMASK),
(long long)stb.st_size, last);
Из приведенного выше кода ясно, что этими тремя аргументами являются режим файла (биты разрешений), размер файла и имя файла. Снова имя файла не может содержать косую черту, в противном случае оно игнорируется.
Похоже, что дерево каталогов рекурсивно обходит, и обрабатывается только имя пройденного уровня.
Кстати, код в OpenSSH scp
кажется действительно старым, процитированный материал уже находится в реализации BSD 4.x rcp
. Смотрите здесь .
Посмотрев на реализацию pscp
(шпатлевка УПП) здесь мы можем признать BSD материал (см вокруг линии 1524), но обработка файла отличается. Вот почему это работает.