作为子进程运行时,无密码 ssh 仍然要求输入密码

作为子进程运行时,无密码 ssh 仍然要求输入密码

我设置了无密码 ssh(keygen)来从我的个人笔记本电脑访问我的远程工作空间。在远程服务器上,我确实使用带有密码的帐户进行连接。设置公钥/私钥身份验证使我无需输入此密码即可进行连接。

我正在运行的 Python 脚本用于subprocess.Popen()再次 ssh 进入此远程工作区。不过,这期间并不是无密码的 ssh。我已检查我的权限并尝试删除并重新创建密钥,但这种情况仍然发生。

下面是相关的Python代码。

subprocess.Popen(['ssh', machine_addr, 'cd ' + workspace + \ '; python dispynode.py --serve 1 --clean --dest_path_prefix dispytmp_' + str(i)])

答案1

我知道这个问题已经在 4 年前被问过,但我遇到了同样的问题,并找到了对我有用的解释和解决方案,所以这可能对处于相同情况的其他人有帮助。

语境

和你一样,我生成并在我的客户端(Raspberry Pi)和我的服务器之间共享 ssh 密钥。我能够通过 ssh 连接,而无需运行密码提示ssh user@server。但是当我的 Python 脚本尝试连接 时subprocess.Popen,它要求输入密码。

解释

问题是我使用 sudo 运行我的 Python 脚本,因为出于某些原因我需要这样做。

因此,ssh 命令运行时subprocess.Popen使用位于 的 ssh 密钥/root/.ssh/id_rsa,而生成并与服务器共享的密钥位于/home/user/.ssh/id_rsa

解决方案

将正确的标识文件作为参数添加到 ssh 命令:

ssh -i /home/user/.ssh/id_rsa user@server

所以您需要的 Python 行如下:

subprocess.Popen(['ssh', '-i', '/home/user/.ssh/id_rsa', 'user@server']

您可以在其中添加所需的命令(cd、mkdir 等)。

希望这可以帮助 !

相关内容