Ich erhalte eine Fehlermeldung:
awk: bad regex '{|: |}': Ungültiger vorangegangener regulärer Ausdruck {"arguments": {}, "result": "success"} {"port": 37482}
Was meiner Meinung nach mit dieser Zeile zusammenhängt:
PORT=$(echo $json | awk 'BEGIN{r=1;FS="{|:|}"} /port/{r=0; print $3} END{exit r}')
#echo $PORT
Weiß jemand, was es bedeutet und wie ich es beheben kann? Ich bin neu in der Skripterstellung, verstehe aber den Ausdruck |: | ist falsch. $ json ist eine Datei, die ich aus meinem VPN mit Portinformationen für die Weiterleitung ziehe.
Meine Eingabe:
#!/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
Das Skript stammt von: https://www.privateinternetaccess.com/forum/discussion/23431/new-pia-port-forwarding-api/p3 ?
Es wurde entwickelt, um eine Anforderung an die API für eine Portnummer zu richten und diesen empfangenen Port dann an den Übertragungsdämon weiterzuleiten.
Antworten:
Wenn Sie fragen " Wie kann ich die Portnummer aus diesen Eingabedaten abrufen? ", Mit den folgenden Daten:
Dann rate ich dir mal
jq
:jq -s
Wird die Eingabe in ein Array " schlürfen ", ist dies erforderlich, da Sie zwei unterschiedliche Objekte bereitstellen:Sie müssen dann das zweite Element des Arrays (
.[1]
) und anschließend dasport
Element ' ' (.[1].port
) adressieren .Als Erweiterung, um einige Ihrer weiteren Fragen zu beantworten:
Sie wissen, was der JSON ist, und können ihn einfach ausdrucken, in eine Datei umleiten usw.
Ich habe oben eine Methode zum Extrahieren der Portnummer identifiziert, aber wenn Sie diese nicht verwenden können / möchten
jq
,python
funktioniert sie einwandfrei , aber Ihre Eingabe scheint leider nicht ganz JSON zu sein. Wir müssen also arbeiten etwas schwieriger:Hinweis : Wir müssen JSON als erstes Argument übergeben, da das Skript über stdin eingeht, sodass der
echo xxx | jq
oben beschriebene Ansatz nicht gut funktioniert.Ich kann Ihnen bei der Übertragung nicht helfen.
quelle
Erfolg! Arbeitsskript unten:
Abhängigkeiten: transmission-remote - Sie können das Paket transmission-remote-openssl über optware installieren. sha256sum - optware-Paket coreutils-sha256sum
quelle