Запуск клиента `scp` -> сервер приводит к тому, что команда scp не найдена (на сервере), почему?

Использование синтаксических анализаторов XML является правильным способом работы с XML-документами.

xmlstarletрешение:

xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt 
&& xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml && mv tmp.xml yourxml 

cat temp.txt
45.90
0
String
1
0
1


  • xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt— извлекает первое объявление тега capacityи перенаправляет вывод в temp.txt

  • xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml— удаляет первый тег capacityиз документа (через -dудалить действие) и перенаправляет измененное содержимое документа во временный файл tmp.xml

  • mv tmp.xml yourxml— заменить исходный xml-документ его измененной версией

1
17.07.2018, 07:45
3 ответа

Очевидно, что для его использования у вас должен быть протокол в обоих экземплярах. Если вам нужна альтернатива, можете использовать ssh, как показано ниже.

ssh user@ip "cat > destination" < file.txt
1
27.01.2020, 23:14

Думаю, вы сами ответили на свой вопрос :нужно scpс обеих сторон.

Локальный экземпляр scpвызывает scpудаленно с недокументированным флагом -tдля обработки протокола передачи файлов.

Если у вас действительно нет scp, но есть сервер ssh, вы можете использовать sftpдля передачи файлов, так как во многих случаях компонент сервера SFTP встроен в сервер ssh.

3
27.01.2020, 23:14

TLDR

Протокол SSH упрощает несколько перекрывающихся «сервисов», одним из которых является копирование файлов. Протокол SSH делает это путем запуска scp -tв качестве дочернего процесса на сервере, когда клиент подключается к нему с помощью инструмента командной строки scp.

Для каждого сервера, на котором установлен SSH, требуется полный набор инструментов CLI для предоставления всех «служб», являющихся частью SSH (ssh, scp, sftp). Это место на диске требуется только демону управляющего сервера sshd. Это означает, что они могут находиться в любом месте, клиенты не знают и не должны знать, они общаются только с sshdчерез порт TCP (, обычно 22 ), как клиент/сервер.


Фон

Такие приложения, как scp, rsyncи ssh, сами по себе являются клиент-серверными приложениями. Это означает, что им требуется как клиентское приложение scp, так и серверное приложение. В данном случае scp— это и то, и другое.

Вот пример

$ scp /Users/user1/thumbnails-digikam.db pi-hole:/tmp/.
thumbnails-digikam.db                                                                                                                                   0%    0     0.0KB/s   --:-- ETA^Z
[1]+  Stopped                 scp /Users/sammingolelli/thumbnails-digikam.db pi-hole:/tmp/.

Я запустил scpсо своего ноутбука на сервер Raspberry Pi (pi -отверстие ), а затем приостановил его в середине -потока с помощью Ctrl + Z .

Если я затем sshзайду на сервер Raspberry Pi и сделаюps:

$ ps -eaf | grep [s]cp
pi        9688  6147  0 11:11 ?        00:00:00 scp -t /tmp/.

Мы видим, что сервер приложений scpработает и записывает наш файл в каталог /tmp.Мы также видим, что файл в этом приостановленном состоянии записывается :

. Rasberry Pi (сервер)
$ ls -l /tmp/thumbnails-digikam.db
-rw-r--r-- 1 pi pi 2260992 Jul  6 11:12 /tmp/thumbnails-digikam.db
ноутбук (клиент)
$ ls -l ~/thumbnails-digikam.db
-rw-r--r--  1 user1  staff  38551552 Jun  4 00:47 /Users/user1/thumbnails-digikam.db

Если мы позволим scpпродолжить, -приостановив его на ноутбуке, (клиент):

$ fg
scp /Users/user1/thumbnails-digikam.db pi-hole:/tmp/.
thumbnails-digikam.db
$

Это завершится, и если мы снова посмотрим на сервер Raspberry Pi (), вы увидите, что scpприложение больше не работает:

$ ps -eaf|grep [s]cp
$

OpenSSH немного уникален тем, что он запускает серверные приложения (демоны )по требованию только на время выполнения конкретной операции, а затем после завершения передачи завершает их.

Исходным демоном, обеспечивающим это, является демон ssh:

.
$ ps auxf | less
...
root      6132  0.0  0.6  11524  5812 ?        Ss   02:53   0:00  \_ sshd: pi [priv]
pi        6147  0.0  0.4  11812  4016 ?        S    02:53   0:03      \_ sshd: pi@pts/0
pi        6150  0.0  0.4   6172  4036 pts/0    Ss   02:53   0:00          \_ -bash
root      6172  0.0  0.3   7232  3336 pts/0    S    02:53   0:00          |   \_ sudo -Es
root      6176  0.0  0.4   6120  4180 pts/0    S    02:53   0:00          |       \_ /bin/bash
root      9772  0.0  0.3   7888  3076 pts/0    R+   11:20   0:00          |           \_ ps auxf
root      9773  0.0  0.0   3800   480 pts/0    S+   11:20   0:00          |           \_ less
pi        9745  0.2  0.1   3988  1872 ?        Ss   11:19   0:00          \_ scp -t /tmp/.
...

Обратите внимание на иерархию родитель/потомок scp, это дочерний процесс ssh.

Анатомия сеанса scp

Если вы посмотрите книгу OReilly SSH , там есть схема, показывающая механизм работы scpсоединений.

                ss1

На диаграмме выше видно, что при выполнении команды scp <file> <server>:/<path>она преобразуется в нечто подобное на стороне клиента:

/usr/bin/ssh -x -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes -- pi-hole scp -t /tmp/.

Клиент(scp)в этом случае указывает демону sshdна стороне клиента отправить запрос серверу sshd, сообщая ему о запуске scp -t /tmpна удаленной стороне.

Судя по документации, это предусмотрено тем, как scpиспользует туннель SSH.

         ss2

Дополнительные сведения

Я провел несколько экспериментов, скопировав двоичный файл scpв myscp, а затем запустив его на клиенте. В каждом случае команда /usr/bin/ssh...по-прежнему показывала -- someserver scp -t /tmp/..

Это наводит меня на мысль, что имя исполняемого файла scp, несмотря на то, что клиент scpссылается на него при выполнении команды ssh, не передается клиенту напрямую.Скорее демон sshdимеет имена для различных клиентских инструментов, которые он поддерживает, жестко запрограммированные внутри него.

Это также подтверждается деталями, показанными в таблице выше.

Выводы

Невозможно полностью удалить/отключить определение --with-default-pathпри компиляции sshd. Его полное удаление лишает sshdспособности искать scp -t <dir>при установлении соединения scp.

Лучшее, что вы можете сделать, чтобы изолировать sshd, — это указать каталог, который содержит только различные двоичные файлы, составляющие OpenSSH.

Ссылки

2
27.01.2020, 23:14

Теги

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