如何在同一台机器上与OpenSSH进行通信? 它有API吗?

我和OpenSSH服务器在同一台机器上,也就是说,我不需要进行身份validation。 但是,我希望能够从Python或其他语言的客户端应用程序与OpenSSH服务器进行通信。 也就是说,当一个新的客户端连接,在我的Python脚本,我想获得通知,并检索他们的公共密钥,IP地址等,并拒绝login客户端。 或者也许允许 – 取决于一些条件。

OpenSSH服务器是否提供这样的API或callback?

它不提供API。

记住,因为你正在谈论authentication,OpenSSH可以使用PAM。 所以你可能会收集一些关于authentication的信息,并在PAM模块中作出允许/拒绝的决定,但我认为这不能用python来完成。

如果您的客户端从不使用密码,但始终使用密钥,则可以使用sshd_config中的AuthorizedKeysCommand参数来执行您的Python脚本以validationSSH密钥。 你也许可以通过检测你的Python进程父进程并检查它的文件描述符来做一些技巧来findIP等等。

我希望这有帮助。

我看到两种方法来解释你的问题。

日志监视

也许你真的在寻找像Fail2ban这样的日志监控脚本(这是一个免费的软件python项目,所以你可以看到他们的代码如何工作)。

SSH服务器日志根据其安装方式的不同而有所不同。 它们通常位于/var/log/auth.log /var/log/secure/var/log/secure /var/log/sshd.log或类似名称的备用日志区域,如/usr/local/var/log/ (另请参阅如何检查sshd日志? )。 这是一个示例日志:

 Aug 14 12:34:56 jodari-desktop sshd[12345]: Accepted pubkey for jodari from 127.0.0.1 port 54321 ssh2: RSA SHA256:3xyQ+PG0Z3CIiShclJ2iNya5TOdKDgE/HrOXr11IdOo 

如果你“想获得通知,并检索他们的公共密钥,IP地址等” 那么你只需要监视那一行。 (可能需要增加/etc/ssh/sshd_config的LogLevel或文件所在的位置。)

如果您想要检索用户的实际公钥(而不是指纹),那么您的脚本只需要遍历它们的$HOME/.ssh/authorized_keys文件(这是默认位置;可以使用AuthorizedKeysFile指令进行更改在你的sshd_config )。 您需要将指纹与公钥匹配。 如果文件中只有一行是有效的,那么它是免费的,但是否则需要生成每个公钥的指纹并将其与从日志中提取的指纹进行匹配。 只需在以下命令的输出中search指纹:

 ssh-keygen -lf "$HOME/.ssh/authorized_keys" 

通过SSH运行命令

如果你真的想要像在SSH会话中那样运行,你可以使用无密码的SSH密钥来运行命令。

生成仅供内部使用的ssh密钥,您将通过本地主机上的ssh进行自动无密码访问。 这将保持一切由OpenSSH控制,所以要监视连接,只需要查找本地主机通过标准SSH日志中的专用内部密钥进行身份validation。

我不能用python的方式来做这件事,但是你可以用python做所有这些,就像系统调用一样。

创build密钥:

 mkdir -p "$HOME/.ssh" chmod 700 "$HOME/.ssh" ssh keygen -t rsa -b 4096 -P "" -C "python script PASSWORDLESS access" \ -f "$HOME/.ssh/python-localhost.id_rsa" 

要在本地安装:

 cat "$HOME/.ssh/python-localhost.id_rsa.pub" >> "$HOME/.ssh/authorized_keys" 

然后使用它:

 ssh -i "$HOME/.ssh/python-localhost.id_rsa" localhost your_command_goes_here