如何识别通过SSH调用脚本的发起方?Ubuntu多主机日志记录实现问询
当然可以实现!这里有几种实用方案
方案1:直接在 provider.sh 中添加日志逻辑
这是最直接的方式,不需要改动SSH配置,只需要修改你的脚本本身:
在 provider.sh 的开头加入以下代码,就能自动记录调用时间、客户端信息和传入的参数:
#!/bin/bash # 获取调用者的客户端IP(通过SSH连接环境变量) CLIENT_IP=$(echo "$SSH_CLIENT" | awk '{print $1}') # 获取登录server1的客户端用户名(就是你SSH命令里的<client_name>) CLIENT_NAME="$USER" # 获取当前时间,格式为年-月-日 时:分:秒 CALL_TIME=$(date "+%Y-%m-%d %H:%M:%S") # 定义日志文件路径,你可以改成自己喜欢的位置 LOG_FILE="/var/log/provider_script_calls.log" # 写入日志内容,包含时间、客户端信息和调用参数 echo "[$CALL_TIME] 客户端 '$CLIENT_NAME'(IP: $CLIENT_IP)调用脚本,参数:$*" >> "$LOG_FILE" # 下面是你原来的provider.sh脚本内容...
说明:
$SSH_CLIENT是SSH连接时自动设置的环境变量,格式为客户端IP 客户端端口 server1端口,用awk提取第一个字段就是客户端IP。$USER就是客户端用来登录server1的用户名(也就是你命令里的<client_name>),能精准定位是哪个客户端。- 记得提前创建日志文件并设置合适的权限,比如:
touch /var/log/provider_script_calls.log && chmod 644 $_,避免脚本无写入权限。
方案2:通过SSH服务器配置记录(无需修改原脚本)
如果你不想改动现有的provider.sh,可以通过配置server1的SSH服务来实现全局记录:
- 在server1上创建一个日志记录脚本,比如
/usr/local/bin/log_ssh_calls.sh:
#!/bin/bash # 获取客户端信息 CLIENT_USER="$USER" CLIENT_IP=$(echo "$SSH_CLIENT" | awk '{print $1}') CALL_TIME=$(date "+%Y-%m-%d %H:%M:%S") LOG_FILE="/var/log/ssh_command_calls.log" # 记录原命令(也就是客户端执行的`/path/to/provider.sh args1 arg2`) echo "[$CALL_TIME] 用户 '$CLIENT_USER'(IP: $CLIENT_IP)执行命令:$SSH_ORIGINAL_COMMAND" >> "$LOG_FILE" # 执行客户端原本要运行的命令 exec "$SSH_ORIGINAL_COMMAND"
给这个脚本添加执行权限:
chmod +x /usr/local/bin/log_ssh_calls.sh修改server1的SSH配置文件
/etc/ssh/sshd_config,添加以下内容(针对server2和server3的用户):
Match User server2,server3 ForceCommand /usr/local/bin/log_ssh_calls.sh
- 重启SSH服务生效:
systemctl restart sshd
说明:
ForceCommand会强制指定用户执行这个日志脚本,然后通过$SSH_ORIGINAL_COMMAND获取用户原本要执行的命令,记录后再执行原命令。- 这个方案不仅能记录
provider.sh的调用,还能记录这两个用户通过SSH执行的所有命令,适合需要全面监控的场景。
不管选哪种方案,都能完美满足你“记录何时由哪个客户端调用provider.sh”的需求,根据自己的实际情况选就行~
内容的提问来源于stack exchange,提问作者suanziliu
相关产品推荐
相关产品推荐

