How do I change directories using Paramiko?

Question:

Drush commands not executing using Paramiko

I posted the above question regarding a persistent error message that I receive using Paramiko. I do not think it is related to my next question, but it might be.

I can successfully connect to my server via SSH using Paramiko. I can execute commands like ls or pwd. What I can’t seem to do is change directories. I can send the command “cd ..” for example, but when I follow up with “pwd” it shows that I haven’t changed directories. It just lists the initial directory I am in when I log in.

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

Am I misunderstanding what is going on here? Should I not be able to change directories? Or if I can, should I be doing it in some other way than using exec_command?

Asked By: Mike Ryan

||

Answers:

This guy had it figured out: http://www.vertigrated.com/blog/2010/02/python-remote-ssh-with-paramiko/

You just have to send multiple commands with one exec_command, such as:

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

Then stdout.readlines() will return the directory that you changed to.

Answered By: Mike Ryan

A bit late with this one, but its possible to ‘invoke_shell’ and write to the standard input through a file.

Please see:
https://stackoverflow.com/a/6203877/1861353

Seems a little bit heavyweight since you can just ‘;’.join(cmdlist) and send to the exec_command.

Answered By: Kevin R.

As of version 2.6, if you use the SFTPClient, the method to change directories is

sftp = myssh.open_sftp()
sftp.chdir('path/to/directory')

Answered By: jarriett

Well paramiko creates an instance of shell and all the commands that you wish to execute in paramiko have to be given in that instance of shell only.

For example:
Let us say I have some folder in the directory I am in.

folder1
folder2
folder3

Now if I want to cd into folder 1 and make a directory there what I would do is:

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

if you write it like:

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

you would get the result like

folder1
folder2
folder3
folder4

as those were two different instances of the shell and would be independent in their function.

Answered By: Aklank Jain
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.