如何在开始新会话后获取当前 ssm sessionId?
How to get current ssm sessionId after starting a new session?
我正在尝试在启动会话后获取当前的 aws ssm sessionId。我可以看到当我启动它时它被打印出来,像这样
Starting session with SessionId: test@test.com-0ftz59d2285d67fb5
但我不知道这是从哪里来的。
我还可以看到我可以从 ssm-session worker 获取它,但我正在尝试以更简洁的方式获取它:
[ssm-user@ip-100-66-11-11 bin]$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-03-08 09:54:44 UTC; 2h 48min ago
Main PID: 3092 (amazon-ssm-agen)
CGroup: /system.slice/amazon-ssm-agent.service
├─ 875 /usr/bin/ssm-session-worker test@test.com-0ftz59d2285d67fb5 i-0a7bb9a9064ccc96
├─ 886 bash -l
├─3092 /usr/bin/amazon-ssm-agent
└─3272 /usr/bin/ssm-agent-worker
我找到了两个解决方案。第一个是使用代理在 /var/lib
路径上写的内容,因为它在那里写了通道的名称,这与 ssm 会话 ID 相匹配。我们可以这样检索它:
# gets the EC2 instance ID
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# the most recent channel matches the current ssm session id
sudo ls -t /var/lib/amazon/ssm/${INSTANCE_ID}/channels | head -1
另一个选项是由 AWS 支持提供给我的,它基于登录 shell 的 PID。如果您直接在会话 shell 中 运行 这将是 SSM 会话工作者的 PID。循环 运行s 直到找到 SSM 会话工作器,然后从参数中提取会话 ID,或者直到不存在父进程。要 运行 这个你需要 sudo 访问和 运行 这个使用 sudo。即使在使用 sudo su 时它仍然有效。 $PPID为当前进程的父进程id。
#!/bin/bash
PROCESSID=$PPID
while [ $PROCESSID ]
do
SESSIONWORKERPID=$(ps -o ppid= -o args= -p $PROCESSID 2> null)
if [[ "$SESSIONWORKERPID" =~ .*ssm-session-worker.* ]]; then
if [[ "$SESSIONWORKERPID" =~ .*?[[:space:]](.*?)[[:space:]].* ]]; then
echo ${BASH_REMATCH[1]}
fi
break;
fi
PROCESSID=$(ps -o ppid= -p $PROCESSID 2> null)
if [[ ! $PROCESSID ]]; then
echo "Session Id Not Found"
fi
done
我正在尝试在启动会话后获取当前的 aws ssm sessionId。我可以看到当我启动它时它被打印出来,像这样
Starting session with SessionId: test@test.com-0ftz59d2285d67fb5
但我不知道这是从哪里来的。
我还可以看到我可以从 ssm-session worker 获取它,但我正在尝试以更简洁的方式获取它:
[ssm-user@ip-100-66-11-11 bin]$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-03-08 09:54:44 UTC; 2h 48min ago
Main PID: 3092 (amazon-ssm-agen)
CGroup: /system.slice/amazon-ssm-agent.service
├─ 875 /usr/bin/ssm-session-worker test@test.com-0ftz59d2285d67fb5 i-0a7bb9a9064ccc96
├─ 886 bash -l
├─3092 /usr/bin/amazon-ssm-agent
└─3272 /usr/bin/ssm-agent-worker
我找到了两个解决方案。第一个是使用代理在 /var/lib
路径上写的内容,因为它在那里写了通道的名称,这与 ssm 会话 ID 相匹配。我们可以这样检索它:
# gets the EC2 instance ID
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# the most recent channel matches the current ssm session id
sudo ls -t /var/lib/amazon/ssm/${INSTANCE_ID}/channels | head -1
另一个选项是由 AWS 支持提供给我的,它基于登录 shell 的 PID。如果您直接在会话 shell 中 运行 这将是 SSM 会话工作者的 PID。循环 运行s 直到找到 SSM 会话工作器,然后从参数中提取会话 ID,或者直到不存在父进程。要 运行 这个你需要 sudo 访问和 运行 这个使用 sudo。即使在使用 sudo su 时它仍然有效。 $PPID为当前进程的父进程id。
#!/bin/bash
PROCESSID=$PPID
while [ $PROCESSID ]
do
SESSIONWORKERPID=$(ps -o ppid= -o args= -p $PROCESSID 2> null)
if [[ "$SESSIONWORKERPID" =~ .*ssm-session-worker.* ]]; then
if [[ "$SESSIONWORKERPID" =~ .*?[[:space:]](.*?)[[:space:]].* ]]; then
echo ${BASH_REMATCH[1]}
fi
break;
fi
PROCESSID=$(ps -o ppid= -p $PROCESSID 2> null)
if [[ ! $PROCESSID ]]; then
echo "Session Id Not Found"
fi
done