Paramiko: calling “cd” command with exec_command d

2019-06-07 03:06发布

问题:

I have the following program using Paramiko:

#!/usr/bin/env python

import paramiko

hostname = '192.168.1.12'
port = 22
username = 'root'
password = 'whatl0ol'

if __name__ == "__main__":
    paramiko.util.log_to_file('paramiko.log')
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.connect(hostname, port, username, password)             

while True:
      pick = raw_input("sshpy: ")
      stdin, stdout, stderr = ssh.exec_command(pick)
      print stdout.readlines() 

But when I connect and try to use cd, it doesn't work. How can I fix this?

回答1:

Is looks like you are implementing some kind of interactive program that allows executing a sequence of commands on the server.

The SSHClient.exec_command executes each command in a separate "exec" channel. The individual commands run in their own environment. So if you execute cd command, it has no effect at all on subsequent commands. They will again start in user's home directory.

If you want to implement an interactive shell session. Use SSHClient.invoke_shell.
For an example, see how to interact with Paramiko's interactive shell session?

See also Execute multiple commands in Paramiko so that commands are affected by their predecessors.



回答2:

Paramiko SSH_Client opens a new session and executes the command in that session and once command execution gets completed, the session channel is closed.

Executing 'cd' command would have been done in the first session and later on, for the next command the session would start again from home directory.

If you want to hold the session, use invoke_shell for an interactive session.