Использование синтаксических анализаторов 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-документ его измененной версией
Очевидно, что для его использования у вас должен быть протокол в обоих экземплярах. Если вам нужна альтернатива, можете использовать ssh, как показано ниже.
ssh user@ip "cat > destination" < file.txt
Думаю, вы сами ответили на свой вопрос :нужно scp
с обеих сторон.
Локальный экземпляр scp
вызывает scp
удаленно с недокументированным флагом -t
для обработки протокола передачи файлов.
Если у вас действительно нет scp
, но есть сервер ssh
, вы можете использовать sftp
для передачи файлов, так как во многих случаях компонент сервера SFTP встроен в сервер ssh
.
Протокол 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
.Мы также видим, что файл в этом приостановленном состоянии записывается :
$ 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
соединений.
На диаграмме выше видно, что при выполнении команды 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.
Я провел несколько экспериментов, скопировав двоичный файл scp
в myscp
, а затем запустив его на клиенте. В каждом случае команда /usr/bin/ssh...
по-прежнему показывала -- someserver scp -t /tmp/.
.
Это наводит меня на мысль, что имя исполняемого файла scp
, несмотря на то, что клиент scp
ссылается на него при выполнении команды ssh
, не передается клиенту напрямую.Скорее демон sshd
имеет имена для различных клиентских инструментов, которые он поддерживает, жестко запрограммированные внутри него.
Это также подтверждается деталями, показанными в таблице выше.
Невозможно полностью удалить/отключить определение --with-default-path
при компиляции sshd
. Его полное удаление лишает sshd
способности искать scp -t <dir>
при установлении соединения scp
.
Лучшее, что вы можете сделать, чтобы изолировать sshd
, — это указать каталог, который содержит только различные двоичные файлы, составляющие OpenSSH.