
Tengo el siguiente método complicado para inyectar la dirección IP en una instancia ec2 en la línea de comando. Funciona pero tiene algunos problemas obvios y estoy buscando una buena manera de solucionarlos:
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
Mi método tiene un par de problemas que quiero abordar:
- Genera una gran cantidad de resultados no deseados al cargar o iniciar sesión en bash:
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
- El otro problema es que esto se ejecuta cada vez que inicio sesión en bash o recargo bash. Me gustaría encontrar una manera de evitar esto si ya se conoce la dirección IP.
Respuesta1
Solicitó específicamente una salida detallada de curl en la segunda línea de comando, que representa la mayor parte de la salida. Deberías eliminar -v
. Luego, para suprimir el medidor de progreso, use -s
(en ambos comandos). Esto debería dejarlo sin resultados, a menos que haya un error.
Sería mejor si ejecutara esto al inicio y escribiera la dirección IP resultante en un archivo, y luego simplemente leyera el contenido de ese archivo en su perfil de bash. (Esto supone que la dirección IP no cambia mientras se ejecuta la instancia, lo que AFAIK no sucede).
Considere un script de inicio local como este:
#!/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
Ahora puedes leerlo en tu perfil de bash:
IP=$(cat /tmp/local-ipv4)