使用Paramiko传输(通道)通过私钥认证

5 投票
1 回答
18339 浏览
提问于 2025-04-17 17:04

我正在尝试使用Paramiko来打开一个通道,这样我就可以发出一些命令;不过,我找不到一个同时使用paramiko.Transport和私钥的例子。我已经能够连接到我的服务器,并且用以下代码运行一个命令:

    ssh = paramiko.SSHClient()
    paramiko.util.log_to_file("support_scripts.log")
    private_key = paramiko.RSAKey.from_private_key_file(rsa_private_key)
    ssh.connect(server, username=user, password='', pkey=private_key)
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)

这方面没有问题。根据我的理解,这并没有创建一个“交互式会话”,这意味着我不能先执行cd /home/my_user/my_scripts,然后再执行另一个命令,比如python script_in_my_scripts_folder.py。因此,我正在尝试使用Paramiko的Transport对象,它可以帮助我保持一个交互式会话。我搜索了很多地方,但找到的例子都不适合我。目前,以下代码在第204行返回“SSHException: Channel is not open”,这行代码是exec_command:

    PRIVATEKEY = '/home/my_user/.ssh/id_rsa'
    user = 'harperville'
    server = '10.0.10.10'
    port = 22
    paramiko.util.log_to_file("support_scripts.log")
    trans = paramiko.Transport((server,port))
    rsa_key = paramiko.RSAKey.from_private_key_file(PRIVATEKEY)
    trans.connect(username=user, pkey=rsa_key)
    session = trans.open_channel("session")
    session.exec_command('cd /home/harperville/my_scripts/')

我理解它大概在告诉我什么,但我找不到或理解文档来帮助我解决这个问题。

提前谢谢你。

1 个回答

3

我在这个网站的帮助下找到了问题所在:http://j2labs.tumblr.com/post/4477180133/ssh-with-pythons-paramiko

如果我把:

session = trans.open_channel("session")

改成:

session = trans.open_session()

那么,我就可以使用以下方式运行一个命令:

session.exec_command('cd /home/harperville/my_scripts/')

撰写回答