Комментарии к многострочным цепочкам команд?

Часть, которая считывает ввод пользователя с терминала, должна работать на переднем плане. В большинстве настроек sudo необходимо запускать на переднем плане.

Вызов sudo для всего скрипта. Вызов sudo отдельно, подобным этому, для выполнения последовательных команд не имеет особого смысла.

Предполагая, что openconnect не считывает вводимые пользователем данные, измените Script на

VPNUSER=Rilcon42
VPNGRP=01
VPNURL=https://remote.someserver.edu
VPNSCRIPT=/usr/share/vpnc-scripts/vpnc-script

sudo -b sh -c '
  openvpn --mktun --dev tun1 &&
  ifconfig tun1 up && {
    /usr/sbin/openconnect -s "$1" "$2" --user="$3" --authgroup="$4" --interface=tun1
    ifconfig tun1 down
  }
' "$VPNSCRIPT" "$VPNURL" "$VPNUSER" "$VPNGRP"

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

Я не знаком с openconnect, поэтому догадываюсь, что он делает. Если openconnect требует ввода данных пользователем с терминала, а затем блокируется до тех пор, пока VPN не будет отключен, запуск его в фоновом режиме не будет работать. Но если это работает так, вероятно, у него есть возможность перейти в фоновый режим после прочтения пароля.

2
15.12.2018, 18:54
1 ответ

Единственное, что делает вашу команду недопустимой синтаксис, это тот факт, что вы без необходимости пропускаете символы новой строки в каждой строке.

Ваша команда,

gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

идентично

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  | cut -d' ' -f5 | tr --delete \;)

Другими словами, с точки зрения оболочки, это вовсе не многострочная -команда.

Вставка комментария перед cutделает подстановку команды незавершенной (окончательная )рекомендуется):

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  # Here is a note | cut -d' ' -f5 | tr --delete \;)

Тем не менее, нет необходимости экранировать символы новой строки. Ниже приведен полностью допустимый код:

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            | cut -d' ' -f5
            | tr --delete \;)

Здесь можно вставить комментарий:

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            # Here is a note
            | cut -d' ' -f5
            | tr --delete \;)

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


Судя по фактическому коду , это более безопасный и переносимый вариант (, за исключением исходного grep, который по-прежнему требует использования не -стандартных расширений ):

.
gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
            | grep -F 'option routers'
            # Here is a note
            | cut -d ' ' -f 5
            | tr -d ';' )
2
27.01.2020, 21:53

Теги

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