
Ich habe die folgende komplizierte Methode, um die IP-Adresse einer EC2-Instanz in die Befehlszeile einzufügen. Sie funktioniert, hat aber einige offensichtliche Probleme und ich suche nach einer guten Möglichkeit, diese zu lösen:
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
IP=`curl -H "X-aws-ec2-metadata-token: \$TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4`
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@$IP-\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='$IP${debian_chroot:+($debian_chroot)}\u@$IP-\H:\w\$ '
fi
Meine Methode weist einige Probleme auf, die ich ansprechen möchte:
- Beim Laden oder Anmelden bei Bash wird eine Menge unerwünschter Ausgabe generiert:
Last login: Thu Dec 17 16:57:37 2020 from 22.123.17.122
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 56 100 56 0 0 11200 0 --:--:-- --:--:-- --:--:-- 11200
* Expire in 0 ms for 6 (transfer 0x560383dabf90)
* Trying 169.254.169.254...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x560383dabf90)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/local-ipv4 HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.64.0
> Accept: */*
> X-aws-ec2-metadata-token: AQAAAEjtIasdfadfasdf5ksdjkjkkasdfe947xQ==
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Accept-Ranges: bytes
< Content-Length: 12
< Content-Type: text/plain
< Date: Thu, 17 Dec 2020 22:52:25 GMT
< Last-Modified: Tue, 15 Dec 2020 14:11:17 GMT
< X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21600
< Connection: close
< Server: EC2ws
<
{ [12 bytes data]
100 12 100 12 0 0 2400 0 --:--:-- --:--:-- --:--:-- 2400
* Closing connection 0
- Das andere Problem ist, dass dies jedes Mal ausgeführt wird, wenn ich mich bei Bash anmelde oder Bash neu lade. Ich würde gerne einen Weg finden, dies zu umgehen, wenn die IP-Adresse bereits bekannt ist.
Antwort1
Sie haben ausdrücklich nach einer ausführlichen Ausgabe von curl in der zweiten Befehlszeile gefragt, die den größten Teil der Ausgabe ausmacht. Sie sollten entfernen -v
. Um dann die Fortschrittsanzeige zu unterdrücken, verwenden Sie -s
(in beiden Befehlen). Dies sollte Ihnen keine Ausgabe hinterlassen, es sei denn, es liegt ein Fehler vor.
Es wäre besser, wenn Sie dies beim Start ausführen und die resultierende IP-Adresse in eine Datei schreiben und dann einfach den Inhalt dieser Datei in Ihrem Bash-Profil lesen. (Dies setzt voraus, dass sich die IP-Adresse während der Ausführung der Instanz nicht ändert, was meines Wissens nach nicht der Fall ist.)
Stellen Sie sich ein lokales Startskript wie das folgende vor:
#!/usr/bin/env bash
TOKEN=`curl -s -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" http://169.254.169.254/latest/api/token`
curl -s -H "X-aws-ec2-metadata-token: \$TOKEN" -o /tmp/local-ipv4 http://169.254.169.254/latest/meta-data/local-ipv4
Jetzt können Sie es in Ihrem Bash-Profil lesen:
IP=$(cat /tmp/local-ipv4)