Execute Multiple Commands in Paramiko So That Commands Are Affected by Their Predecessors

Execute two commands in a row using one SSH object via paramiko

It's not

ssh.exec_command('command1' ; 'command2')

Should be

ssh.exec_command('command1 ; command2')

Execute multiple dependent commands individually with Paramiko and find out when each command finishes

It seems that you want to implement an interactive shell, yet you need to control individual commands execution. That's not really possible with just SSH interface. "shell" channel in SSH is black box with an input and output. So there's nothing in Paramiko that will help you implementing this.

If you need to find out when a specific command finishes or where an output of a specific command ends, you need to use features of a shell.

You can solve that by inserting a unique separator (string) in between and search for it in the channel output stream. With a common *nix shells something like this works:

channel = ssh.invoke_shell()
channel.send('cd /mytargetRep\n')
channel.send('echo unique-string-separating-output-of-the-commands\n')
channel.send('./executeWhatIWant\n')

Though I do not really think that you need that very often. Most commands that are needed to make a specific commands working, like cd or set, do not really output anything.

So in most cases you can use SSHClient.exec_command and your code will be a way simpler and more reliable:

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

Even if you need to use something seemingly complex like su/sudo, it is still better to stick with SSHClient.exec_command:

Executing command using "su -l" in SSH using Python


For a similar question, see:

Combining interactive shell and recv_exit_status method using Paramiko

How to get each dependent command execution output using Paramiko exec_command

The only solution is (as @Barmar already suggested) to insert unique separator between individual commands. Like:

pwd && echo "end-of-pwd" && cd /foo && echo "end-of-cd" && ls -l && echo "end-of-ls"

And then look for the unique string in the output.


Though imo, it is much better to simply separate the commands into individual exec_command calls. Though I do not really think that you need to execute multiple commands in a row often. Usually you only need something like, cd or set, and these commands do not really output anything.

Like:

  1. pwd
  2. ls -la /foo (or cd /foo && ls -la)

For a similar questions, see:

  • Execute multiple dependent commands individually with Paramiko and find out when each command finishes (for "shell" channel)
  • Combining interactive shell and recv_exit_status method using Paramiko


Related Topics



Leave a reply



Submit