如何使用Paramiko更改目录?

50 投票
4 回答
52183 浏览
提问于 2025-04-17 10:38

使用Paramiko时Drush命令无法执行

我在上面提了一个问题,关于我在使用Paramiko时遇到的一个持续出现的错误信息。我觉得这个问题可能和我接下来的问题没关系,但也有可能有关。

我可以通过Paramiko成功连接到我的服务器,使用SSH连接后可以执行一些命令,比如ls(列出文件)或者pwd(显示当前目录)。但是我发现我无法更改目录。比如我可以发送“cd ..”这个命令,但当我接着输入“pwd”时,它显示我没有改变目录。它只是列出了我登录时所在的初始目录。

>>> stdin, stdout, stderr = myssh.exec_command("pwd")
>>> stdout.readlines()
['/big/dom/home/myid\n']
>>> stdin, stdout, stderr = myssh.exec_command("cd ../")
>>> stdout.readlines()
[]
>>> stdin, stdout, stderr = myssh.exec_command("pwd")
>>> stdout.readlines()
['/big/dom/home/myid\n']
>>>

我是不是对这里的情况理解错了?我难道不能更改目录吗?如果可以的话,我是不是应该用其他方式而不是exec_command来实现?

4 个回答

8

从2.6版本开始,如果你使用SFTPClient,改变目录的方法是:

sftp = myssh.open_sftp() // 打开一个SFTP连接 sftp.chdir('path/to/directory') // 切换到指定的目录
10

其实,paramiko会创建一个“命令行”的实例,你想要执行的所有命令都必须在这个“命令行”实例里进行。

举个例子:假设我在当前目录下有一个文件夹。

folder1
folder2
folder3

现在如果我想进入这个文件夹1,并在里面创建一个新目录,我该怎么做呢:

ssh.exec_command('cd folder1;mkdir folder4')

如果你这样写:

ssh.exec_command('cd folder1')
ssh.exec_command('mkdir folder4')

你会得到这样的结果:

folder1
folder2
folder3
folder4

这是因为你使用了两个不同的“命令行”实例,它们的功能是相互独立的。

56

这个家伙找到了办法: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/

你只需要用一个exec_command发送多个命令,比如:

myssh.exec_command('cd ..; pwd')

然后stdout.readlines()会返回你切换到的目录。

撰写回答