Я получаю ошибку:
awk: bad regex '{|: |}': недопустимое предыдущее регулярное выражение { "аргументы": {}, "результат": "Успех"} { "Порт": 37482}
Который я считаю, имеет отношение к этой линии:
PORT=$(echo $json | awk 'BEGIN{r=1;FS="{|:|}"} /port/{r=0; print $3} END{exit r}')
#echo $PORT
Кто-нибудь знает, что это значит и как я могу это исправить? Я новичок в написании сценариев, но, как я понимаю, выражение |: | это неверно. $ json - это файл, который я извлекаю из VPN с информацией о порте для пересылки.
Мой вклад:
#!/usr/bin/env bash
#
# Enable port forwarding when using Private Internet Access
#
# Usage:
# ./port_forwarding.sh
TRANSUSER=xxx
TRANSPASS=xxxx
TRANSHOST=localhost
error( )
{
echo "$@" 1>&2
exit 1
}
error_and_usage( )
{
echo "$@" 1>&2
usage_and_exit 1
}
usage( )
{
echo "Usage: `dirname $0`/$PROGRAM"
}
usage_and_exit( )
{
usage
exit $1
}
version( )
{
echo "$PROGRAM version $VERSION"
}
port_forward_assignment( )
{
client_id_file="/etc/openvpn/pia_client_id"
if [ ! -f "$client_id_file" ]; then
if hash shasum 2>/dev/null; then
head -n 100 /dev/urandom | shasum -a 256 | tr -d " -" > "$client_id_file"
elif hash sha256sum 2>/dev/null; then
head -n 100 /dev/urandom | sha256sum | tr -d " -" > "$client_id_file"
else
echo "Please install shasum or sha256sum, and make sure it is visible in your \$PATH"
exit 1
fi
fi
client_id=`cat "$client_id_file"`
json=`curl "http://209.222.18.222:2000/?client_id=$client_id" 2>/dev/null`
if [ "$json" == "" ]; then
json='Port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding'
fi
echo $json
}
#trim VPN forwarded port from JSON
PORT=$(echo $json | awk 'BEGIN{r=1;FS="{|:|}"} /port/{r=0; print $3} END{exit r}')
#echo $PORT
#change transmission port on the fly
CURLOUT=$(curl -u $TRANSUSER:$TRANSPASS ${TRANSHOST}:9091/transmission/rpc 2>/dev/null)
REGEX='X-Transmission-Session-Id\: (\w*)'
if [[ $CURLOUT =~ $REGEX ]]; then
SESSIONID=${BASH_REMATCH[1]}
else
exit 1
fi
DATA='{"method": "session-set", "arguments": { "peer-port" :'$port' } }'
curl -u $TRANSUSER:$TRANSPASS http://${TRANSHOST}:9091/transmission/rpc -d "$DATA" -H "X-Transmission-Session-Id: $SESSIONID"
EXITCODE=0
PROGRAM=`basename $0`
VERSION=2.1
while test $# -gt 0
do
case $1 in
--usage | --help | -h )
usage_and_exit 0
;;
--version | -v )
version
exit 0
;;
*)
error_and_usage "Unrecognized option: $1"
;;
esac
shift
done
port_forward_assignment
exit 0
Сценарий взят из: https://www.privateinternetaccess.com/forum/discussion/23431/new-pia-port-forwarding-api/p3 ?
Он предназначен для запроса к их API номера порта, а затем для перенаправления полученного порта в демон передачи.
Ответы:
Если вы спрашиваете Как я могу получить номер порта из этих входных данных? ", со следующими данными:
Тогда я бы посоветовал вам взглянуть на
jq
:jq -s
будут " чавкать «вход в массив, это необходимо, так как вы предоставляете два различных объекта:Затем вы должны обратиться ко второму элементу массива (
.[1]
), а затемport
'элемент (.[1].port
).В качестве дополнения для решения некоторых из ваших дальнейших вопросов:
Вы знаете, что такое JSON, вы берете его здесь и можете легко напечатать, перенаправить в файл и т. Д.
Я определил метод для извлечения номера порта выше, но если вы не можете / не хотите использовать
jq
, затемpython
будет работать хорошо , но, к сожалению, ваш ввод не совсем-JSON, поэтому нам нужно работать немного усерднее:Заметка : нам нужно передать JSON в качестве первого аргумента, так как скрипт входит через stdin, поэтому
echo xxx | jq
Подход выше не будет работать хорошо.Я не могу помочь вам взаимодействовать с передачей.
источник
Успех! Рабочий скрипт ниже:
зависимости: translation-remote - вы можете установить пакет translation-remote-openssl через optware. sha256sum - пакет программного обеспечения coreutils-sha256sum
источник