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:
pwd
ls -la /foo
(orcd /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
Python Matplotlib Multiple Bars
Label Python Data Points on Plot
How to Get First Element in a List of Tuples
Python Sharing a Lock Between Processes
Cmd Opens Windows Store When I Type 'Python'
How to Decode Base64 Data in Python
Matplotlib Scatter Plot Legend
Iterating Each Character in a String Using Python
Basic Http File Downloading and Saving to Disk in Python
Appending Pandas Dataframes Generated in a for Loop
Django Filefield with Upload_To Determined at Runtime
Pylint "Unable to Import" Error - How to Set Pythonpath
How to Pass a Method as a Parameter in Python
How to Check a String for Specific Characters
How to Check If There Are Duplicates in a Flat List