Я пытаюсь скопировать файл с моего локального хоста на удаленный хост с помощью команды SCP:

scp -v user@xxx.xxx.xxx.xxx:/local/file/path /destination/path

Удивительно, но команда SCP терпит неудачу в конце после аутентификации по паролю. Я могу сделать SSH для удаленной системы, но SCP не удается. Вот ошибка, которую я получил в конце.

debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: password
debug1: Next authentication method: password
admin@192.168.1.12's password:
debug1: Authentication succeeded (password).
Authenticated to 192.168.1.12 ([192.168.1.12]:22).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending command: scp -v -f /home/random/sample.txt
Sink: C0777 630 /home/random/sample.txt
error: unexpected filename: /home/random/sample.txt

Что является причиной сбоя, я проверил, что исходный файл существует. Я не могу понять, что это за сообщение об ошибке Sink: C0777 630

2 ответа2

2

Короткий ответ: программное обеспечение scp на удаленной системе, похоже, отправляет недопустимое сообщение протокола. Вам следует связаться с поставщиком программного обеспечения для поддержки.

Sink: C0777 630 /home/random/sample.txt
error: unexpected filename: /home/random/sample.txt

Сообщение "раковина" не является ошибкой. Это просто сообщение, дающее команду протокола SCP, полученную от удаленной системы. Вы получаете сообщение "сток", потому что запускаете scp в подробном режиме. Это конкретное сообщение указывает, что удаленная система отправляет файл ('C') с разрешениями 0777, размером 630 байт и именем файла "/home/random/sample.txt".

Сообщение об ошибке указывает на проблему с командой протокола SCP. Проблема в том, что scp программа OpenSSH, которую вы используете для локального конца, не принимает имя файла, содержащее символ «/».

Вот что происходит, когда я запускаю аналогичную команду scp:

$ scp -v localhost:/etc/services .
...
debug1: Sending command: scp -v -f /etc/services
Sending file modes: C0644 677972 services
Sink: C0644 677972 services

Обратите внимание, что часть имени файла в строке "сток" - это не полный путь, а только базовое имя отправляемого файла.

Вы указали, что на удаленной системе запущено программное обеспечение SSH от InterNiche. Вам следует обратиться в эту компанию за поддержкой. Я не знаю формального стандарта для протокола SCP, и трудно даже найти хорошее описание протокола в Интернете. Я думаю, что было бы справедливо сказать, что большинство людей считают версию scp OpenSSH фактическим стандартом и ожидают, что другие реализации scp будут взаимодействовать с OpenSSH.

1

Ваша удаленная сторона реализует 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), но обработка файла отличается. Вот почему это работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .