通过 Python 脚本拒绝所有用户基于密码的 SSH 登录

Posted

技术标签:

【中文标题】通过 Python 脚本拒绝所有用户基于密码的 SSH 登录【英文标题】:Deny password-based SSH login for all users through a Python script 【发布时间】:2021-04-10 16:25:18 【问题描述】:

我正在编写一个 Python 脚本来拒绝远程服务器(Ubuntu 18.04)的基于密码的 SSH 登录。我将在我的主机系统 (Windows) 中运行 Python 脚本。因此,我已经使用 paramiko 模块与远程主机建立了 SSH 连接并初始化了 SSH 客户端。

为了拒绝基于密码的 SSH 登录,我应该编辑 /etc/ssh/sshd_config 文件并将“PasswordAuthentication yes”行更改为“PasswordAuthentication no” 请注意,我的远程系统允许无密码sudo。我只需要在sshd_config 文件中进行这一替换即可。

下面是我尝试过的命令:

ssh_client.exec_command("sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config")

我遇到了错误:couldn't open temporary file .sedVg2nV6: Permission Denied

有没有人遇到过这种情况? 除了sed,还有其他方法可以替换配置文件的一部分吗? sed 是否仅适用于 .txt 文件?

【问题讨论】:

错误信息意味着sed需要以root身份运行来创建它的临时输出文件。错误信息只是一个虚假的症状;这里真正的问题是,如果您不是root,则无法编辑系统文件。 (sed -i 在后台创建一个临时文件,如果成功,则将其移回原始输入文件的顶部。) Unix 的部分优点在于基本上所有的配置文件都是文本文件。 非常感谢你,我是 Unix 新手,希望我能尽快好起来,感谢这个伟大的社区。​​span> 【参考方案1】:

我认为你应该改变ssh_client.exec_command("sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config") tossh_client.exec_command("sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config")(sed命令将以root权限执行)。

【讨论】:

/g 标志在这里也完全没有意义,它表示要替换所有出现的每一行,但您只希望每行最多出现一次。 谢谢。这是一个菜鸟的错误。 @PraveenMathew 没问题!

以上是关于通过 Python 脚本拒绝所有用户基于密码的 SSH 登录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SleekXMPP 或 python 处理 XMPP 订阅我一般

使用python脚本批量向多个主机发送ssh公钥

mySQL 密码策略拒绝所有创建用户的尝试

Google Clas-s-room API - 权限被拒绝

Jenkins Ansibe 插件无法通过 ssh 连接到主机:权限被拒绝(公钥、密码)

Ubuntu WSL Ansible - 用户@localhost 权限被拒绝(公钥,密码)