我有以下复杂的方法将 ec2 实例上的 ip 地址注入命令行。它有效,但存在一些明显的问题,我正在寻找一种解决这些问题的好方法:
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
我的方法有几个问题我想解决:
- 在加载或登录 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
- 另一个问题是每次我登录 bash 或重新加载 bash 时都会运行此程序。如果 IP 地址已知,我想找到一种方法来绕过此问题。
答案1
您特别要求在第二个命令行中使用 curl 的详细输出,这占了输出的大部分。您应该删除-v
。然后,要隐藏进度表,请-s
在两个命令中使用 ()。除非出现错误,否则这应该不会产生任何输出。
最好在启动时运行此程序并将生成的 IP 地址写入文件,然后在 bash 配置文件中读取该文件的内容。(这假设实例运行时 IP 地址不会改变,据我所知,这种情况不会发生。)
考虑这样的本地启动脚本:
#!/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
现在你可以在你的 bash 配置文件中读取它:
IP=$(cat /tmp/local-ipv4)