] Можно проложить трубу через SSH. Пример использования []dd[
]:[
dd bs=1M if=/dev/disk | ssh -C target dd bs=1M of=disk.img
]
[]Если сетевое соединение прерывается во время передачи, вы можете возобновить, если знаете, сколько было скопировано. Например, если Вы уверены, что по крайней мере []1000MiB[
] уже было передано (проверьте размер файла []disk.img[
]):[
dd bs=1M skip=1000 if=/dev/disk | ssh -C target dd bs=1M seek=1000 of=disk.img
]
[][]dd[
] - это всего лишь пример, он работает так же хорошо, как и с другими командами, пока они работают с трубами.[
dd bs=1M if=/dev/disk | ssh -C target dd bs=1M of=disk.img
]
[].
Я бы хотел найти обычный образец для включения в сценарий оболочки, чтобы что n переменных будет содержать n аргументов
Далее создается массив оболочки arglist
, содержащий каждый из аргументов:
$ readarray -t arglist < <(echo "\command{arg1,
arg2 ,
arg3
}" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')
С помощью оператора declare
можно увидеть, что он работал:
$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3")'
Вот еще один пример с аргументами в одной строке:
$ readarray -t arglist < <(echo "\command{arg1, arg2, arg3, arg4}" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')
Опять же, он работает:
$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3" [3]="arg4")'
Обратите внимание, что космос в < (
Мы перенаправляем входные данные из подстановки процесса. Без космоса bash
попробует что-то другое целиком.
Команда sed
немного тонка. Давайте посмотрим на это кусок за раз:
-n
Не печатайте строки, если явно не спрашивается.
/\command/{...}
При обнаружении строки, содержащей \command
, выполните следующие команды в фигурных скобках:
: a ;/}/! {N; b; b}
При этом строки считываются в буфер образца до тех пор, пока не будет найдена строка, содержащая }
. Таким образом, мы получаем всю команду сразу.
s/\\command {//
Удалите \command {
последовательности.
s/[\n} ]//g
Удаление всех мест, закрывающих фигурных скобок и новых строк.
s/,/\n/g
Замените запятые новыми строками. Когда это делается, каждый аргумент находится в отдельной строке, которая является тем, что readarray
хочет.
p
Печать.
Если вы не уверены, какой init, вы можете угадать из ps | grep -E «systemd 'upstart»
. (Некоторые блестящие системы могут присутствовать в устаревших системах запуска, но не наоборот, я думаю). Вы также можете проверить наличие супервизора.
Googling initd говорит мне о /etc/init.d
так что я предполагаю, что это то, что вы имели в виду... Извините, но ничего не приходит в голову для обнаружения sysV init-скриптов других , чем поиск в/etc. (Если вы застряли на sysvinit, я предполагаю, что вы дополнительно хотите /etc/init.d/foo status
или service foo status
, чтобы убедиться, что ваш сервис действительно выполняется из sysvinit. Это не означает, что сервис, к сожалению, был запущен из и sysvinit, и supervisord).
На старте я думаю, что это легко найти работу, потому что initctl list
показывает pids. Так что если он там, то это либо задание запуска, либо sysV init-скрипт, работающий под обратной совместимостью (и см. выше, чтобы обнаружить разницу).
В systemd можно проверить данный pid с помощью поля групп ps , см. ниже. Если группа говорит .service
, она должна быть запущена systemd. Если вы не против поиска (потенциально неоднозначного) процесса name , то systemd-cgls
легче запомнить. Тогда я думаю, что systemctl status foo
даже даст вам достаточно информации для обнаружения sysV init-script для foo.service.
$ ps xawf -eo pid, пользователь, группа, аргументы КОМАНДА CGROUP ПОЛЬЗОВАТЕЛЯ PID 2 корень -[kthreadd] 3 корень -\_ [ksoftirqd/0] [...] 4281 root -\_ [flush-8: 0] 1 корневое имя = systemd :/systemd-1/sbin/init 455 корневое имя = systemd :/systemd-1/sysinit.service/sbin/udevd -d 28188 root name = systemd :/systemd-1/sysinit.service\_/sbin/udevd -d 28191 root name = systemd :/systemd-1/sysinit.service\_/sbin/udevd -d 1096 dbus name = systemd :/systemd-1/dbus.service/bin/dbus-daemon --system --address = systemd: --nofork --systemd-activation [...]
Для супервизора используйте статус супервизора
.
Avahi - низкоуровневый механизм обнаружения служб. Это имеет тенденцию использоваться всеми видами случайных вещей, таким образом, нет никакого способа, которым я могу сказать вам точно, кто использует его, и для какой.
Без извлечения packet sniffer и поиска, ваш выбор состоит в том, чтобы просто жить с ним или отключить всю службу и увидеть, что ломается.
Это клиент DHCP . Он должен принимать пакеты UDP через порт 68. Если компьютер использует DHCP для настройки сети, необходимо оставить его открытым.
Если вы не используете DHCP на этом компьютере, вы можете просто полностью удалить dhclient
.
CUPS является подсистемой печати вашего дистрибутива Linux. Эту службу можно удалить, но это означает, что графический интерфейс пользователя не сможет найти новые принтеры, когда они появятся в сети. Вам придется вернуться к плохим старым дням ввода IP-адресов вручную.
(Если это не принтер Bonjour, то в этом случае его заберет Avahi. Однако обнаружение принтера - это лишь одно из многих действий, которое может сделать Avahi. Не поймите, что эти две услуги взаимно редуцированы. Широкий след Avahi просто происходит, чтобы перекрыть CUPS немного в этой области.)
Я бы не беспокоился об этой службе. Это не связано ни с чем очень чувствительным.