Часть, которая считывает ввод пользователя с терминала, должна работать на переднем плане. В большинстве настроек 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 не будет отключен, запуск его в фоновом режиме не будет работать. Но если это работает так, вероятно, у него есть возможность перейти в фоновый режим после прочтения пароля.
Единственное, что делает вашу команду недопустимой синтаксис, это тот факт, что вы без необходимости пропускаете символы новой строки в каждой строке.
Ваша команда,
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 ';' )