Создать папку на USB после подключения

Вы можете прочитать о команде iptables, используя man iptables.

Это покажет,

   -v, --verbose
          Verbose output.  This option makes the list command show the interface name, the rule options (if any), and the TOS masks.  The
          packet and byte counters are also listed, with the suffix 'K', 'M' or 'G' for 1000,  1,000,000  and  1,000,000,000  multipliers
          respectively  (but  see  the -x flag to change this).  For appending, insertion, deletion and replacement, this causes detailed
          information on the rule or rules to be printed. -v may be specified multiple times to possibly emit more detailed debug  state‐
          ments.

   -n, --numeric
          Numeric  output.  IP addresses and port numbers will be printed in numeric format.  By default, the program will try to display
          them as host names, network names, or services (whenever applicable).

Так, -n показывает номера, а не имена служб. -v не противоположен -n, но показывает имена (что по умолчанию) и гораздо больше данных.

По сути, они оба показывают одно и то же, а именно, что у вас есть эта запись (первая - числовая, вторая - именованная).

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8080

61 3096 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:http-alt

http-alt - это имя службы для порта 8080. По сути, эти две записи - одна и та же строка в разных форматах.

Помимо "открытия порта" (что на самом деле означает просто разрешить трафик через брандмауэр iptables) вам нужно программное обеспечение, готовое принимать трафик на данный порт. Настроен ли McMyAdmin на прослушивание порта 8080?

Команда netstat (среди прочих) может быть использована для просмотра того, какие процессы прослушивают те или иные порты. netstat -an перечисляет все порты (-a) и показывает номера (-n), что делает ее полезной в сочетании с grep. Например, netstat -an | grep 8080 покажет, используют ли какие-либо процессы порт 8080. Вы ожидаете увидеть что-то вроде этого,

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN

Фактические числа могут отличаться. Вы можете использовать -p, чтобы показать, какой процесс использует порт, хотя он показывает их все, только если вы запускаете его от имени root.

Так, sudo netstat -anp | grep 8080 даст что-то вроде:

tcp 0 0 0.0.0.0:8080 0.0.0. 0:* LISTEN 4856/some-process-name

Если вы не получите никаких результатов, значит, порт 8080 никем не используется и не прослушивается, поэтому вы можете просто использовать sudo netstat -anp и просмотреть список процессов и посмотреть, есть ли там тот, который вы ожидаете увидеть, и на каком порту он ПРОСЛУШИВАЕТСЯ.

3
18.05.2019, 23:07
3 ответа

Мой ответ, предлагающий форк, больше не будет работать с более новыми системами udev:

RUN
...
Starting daemons or other long running processes is not appropriate for
udev; the forked processes, detached or not, will be unconditionally killed
after the event handling has finished.

Вы можете использовать универсальный сервер systemd, которому нужен ваш mount, устройство смонтировано, вы используете :sudo systemctl list-units -t mount, чтобы найти монтирование systemd для вашего устройства, запишите его имя.

Затем вы создаете файл с именем /etc/systemd/system/your.service`

[Unit] 
Description=My mount script trigger 
Requires=<whatever the command above returned>.mount 
After=<whatever the command above returned>.mount 

[Service] 
ExecStart=/home/pi/start.sh 

[Install] 
WantedBy=<whatever the command above returned>.mount 

Преимущества:простота установки

Недостатки:будут работать только для USB-устройств с определенным именем. Вы должны сами разработать UUID в сценарии.

0
27.01.2020, 21:29

Needed to implement a thing that would react on USB Flash Drive inserted (into autonomous BBB device) - to get device name, mount fs there, rsync stuff to it, unmount.

To avoid whatever concurrency issues (i.e. multiple things screwing with device in parallel), proper error logging and other startup things, most obvious thing is to wrap the script in a systemd oneshot service.

Only non-immediately-obvious problem for me here was how to pass device to such service properly.

With a bit of digging through google results (and even finding one post here somehow among them), eventually found "Pairing udev's SYSTEMD_WANTS and systemd's templated units" resolved thread, where what seem to be current-best approach is specified.

Адаптация его для моего случая и сопряжение с общими шаблонами для служб, -созданных устройством, привели к следующей конфигурации.

правило udev:

ACTION=="add", PROGRAM="/usr/bin/systemd-escape -p --template=action-usb@.service %E{ID_FS_UUID_ENC}", ENV{SYSTEMD_WANTS}+="%c"

действие -usb@.service:

[Unit]
BindTo=%i.device
After=%i.device

[Service]
Type=oneshot
TimeoutStartSec=300
ExecStart=/home/pi/raspberry-stilas/start.sh /%I

Адаптировано из здесь .

0
27.01.2020, 21:29

Предположим, что /home/pi/start.shимеет шебанг (имеет #!/bin/shв самой первой строке ), sleep 5в строке номер 2 и установлен бит выполнения(chmod +x /home/pi/start.sh).

Используйте setsid, он разветвится, что означает выполнение скрипта в фоновом режиме. Вышеупомянутый сон предназначен для того, чтобы дать вашей системе время для монтирования USB-устройства. Udev не будет ждать завершения сценария, прежде чем смонтировать устройство, setsidвернется немедленно, и устройство должно быть смонтировано быстро.

ACTION=="add", DRIVERS=="usb-storage", RUN+="/usr/bin/setsid /home/pi/start.sh %E{ID_FS_UUID_ENC}"

РЕДАКТИРОВАТЬ :udev ожидает всех потомков, поэтому процесс должен создать свою группу.

Убедитесь, что /home/pi/start.shимеет следующий заголовок:

#!/bin/sh
pgid_from_pid() {
    local pid=$1
    ps -o pgid= "$pid" 2>/dev/null | egrep -o "[0-9]+"
}

pid="$$"
if [ "$pid" != "$(pgid_from_pid $pid)" ]; then
    exec setsid "$(readlink -f "$0")" "$@"
fi
sleep 5

Создайте скрипт init.sh:

#!/bin/sh
/home/pi/start.sh "$@"

В сочетании со следующим правилом udev:

ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh /home/pi/init.sh %E{ID_FS_UUID_ENC}"

1
27.01.2020, 21:29

Теги

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