我正在创建一个脚本,每次 SSH 登录时都会执行 cURL。
我在 /etc/pam.d/sshd 中插入了一个新行,如下所示:
auth required pam_exec.so /bin/curl.sh
我的 curl 脚本如下:
#!/bin/bash
myVar=$(/usr/bin/curl http://127.0.0.1:8081)
echo $myVar >> /tmp/hai
whereis curl >> /tmp/hai
问题是,/tmp/hai
仅记录的输出whereis curl
,而不是curl
[root@loc-4 l-user]# tail -f /tmp/hai
curl: /usr/bin/curl /usr/share/man/man1/curl.1.gz
有人知道为什么会发生这种情况吗?
编辑:我尝试手动运行脚本,但curl
发生了
答案1
关心ENVIRONMENT
!
显示常规登录会话的环境和 pam 等守护进程的环境之间的差异。
将您的行更改/etc/pam.d/sshd
为session
:auth
auth required pam_exec.so /usr/local/sbin/nssh.sh auth
session optional pam_exec.so /usr/local/sbin/nssh.sh session
并更改您的脚本,尝试这个(并以它结束,true
以防止由于错误的结果代码而导致登录被拒绝):
#!/bin/bash
printf -v myfile "/tmp/nssh-%(%Y%02m%02d%H%M%S)T-%04X" -1 $$
exec 1>$myfile.log
exec 2>$myfile.err
echo $0 -- $@
set
if [ "$PAM_TYPE" = "open_session" ] ;then
myVar=$(/usr/bin/curl http://127.0.0.1:8081)
echo $myVar >> /tmp/hai
whereis curl >> /tmp/hai
fi
true
这将在单独的脚本中重定向 STDERR 和 STDOUT,然后在.log
命令行和参数中打印,然后打印环境。
因此,您将能够比较常规会话(手动运行)的环境和从 PAMd 创建的环境。
答案2
一个可能的答案是env
不同于pam_exec
。要考虑的示例变量是$HTTP_PROXY
或$NO_PROXY
。搜索.curlrc
配置文件使用$HOME
或$CURL_HOME
。
例如,由于 ,您的手动运行可以成功NO_PROXY=127.0.0.1
。然后 pam 启动的运行只会返回 HTTP 403,默认情况下 curl 不会显示该信息。我建议首先curl -v
在脚本中运行,这样您就知道您连接到了哪里以及您得到了什么 HTTP 数字响应。