(我不能决定在这里或在超级用户张贴这个,但因为这是一个系统pipe理员的目的,这似乎是一个更好的适合)
我有一种情况,SSH客户端将使用SSH的-R选项请求端口转发。 在连接时,我希望能够logging它们转发的端口。
我打算通过强制执行一个特定的命令(在authorized_keys文件中command=my-command ,也就是这样做)来执行此操作,然后运行原始命令(login名或用户指定的)。
到目前为止,我发现要做到这一点的唯一方法就是运行sudo而且感觉很不好意思:
sudo lsof [email protected] -Fn -p12345 | grep "^n" | grep -v '\->' | awk -F: '{print $NF}' | sort | uniq sudo lsof [email protected] -Fn -p12345 | grep "^n" | grep -v '\->' | awk -F: '{print $NF}' | sort | uniq *其中12345是处理这个连接的sshd的进程ID(也就是我运行的任何脚本的父进程来检查它。
有什么更优雅(为其他连接信息设置的SSH_*环境variables)可用吗?
*对于好奇的是,命令的第一部分将绑定到本地接口( [email protected] )和( -a )的所有networking端口都属于进程12345( -p12345 ),并将其格式化为机器可读性( -Fn ) 。 -P和-n标志使其给出原始端口号和networking地址。 第二部分( grep "^n" )只给出了我的networking信息。 下一部分( grep -v '\->' )消除了已build立的连接(从而留下“监听”端口)。 下一部分( awk -F: '{print $NF}' )使用awk来获取由':'分隔的最后一个字段,给我端口(我不使用cut,因为对于IPv6连接,字段编号可能会改变)。 最后2部分给我一个独特的端口列表。 我把这个解释放在这里,因为lsof是一个非常棒的命令,每个人都应该知道。
您可以将sshd的日志logging级别设置为DEBUG1 ,然后grep日志,您将查找如下行:
Dec 25 21:40:25 d34dh0r53 sshd[21963]: debug1: Local forwarding listening on ::1 port 8085.
根据您使用的日志文件和权限,您将不需要以root身份来读取它。
SSH密钥?
〜#列出转发连接。