fab-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Fab-user] ODP: Fabric 2.4.0 problem - Run method is not being finished


From: mglowinski93
Subject: [Fab-user] ODP: Fabric 2.4.0 problem - Run method is not being finished
Date: Fri, 1 Mar 2019 15:27:38 +0100

Hi,

I’ve one more question regarding run() method.

Is that possible that is not catching output?

 

Currently I’m using that function: https://pastebin.com/8Rd2eVWr

In 99% it is working just fine, but sometimes it happens that it is not catching an output.

In mainly happens while function is being executed in for loop.

 

Regards,

Mateusz Glowinski

 

Od: Jeff Forcier <address@hidden>
Wysłano: sobota, 29 grudnia 2018 21:38
Do: Mateusz <address@hidden>
DW: Fabric Mailing List <address@hidden>
Temat: Re: [Fab-user] Fabric 2.4.0 problem - Run method is not being finished

 

It's arguably both – Fabric's run() (and similar things, like `ssh hostname somecommand`) can't return control to Python until the remote program exits, and spawning an interactive shell (which `su` does, unless you give it `-c`) by definition expects to sit around in the foreground until the user manually quits it.

 

Fabric should be linking up your local stdin/out/err to the remote end by default, so technically you can type `exit` or Ctrl-D to quit that internal shell, and you'd see the `run()` end up finishing and continuing. That's just...not very useful for something intended to be a noninteractive script :) thus, why `su -c` or `sudo` are preferable.

 

Best,

Jeff

 

On Sat, Dec 29, 2018 at 5:21 AM Mateusz <address@hidden> wrote:

Hi Jeff,

thank you for answer. You are right, executing "su -c 'command'" is working fine:)

This is not exactly what i needed, but it is enough for now.

I would like to clarify one thing. You mentioned that "su" spawns a new shell. Is that a reason why "run" command gets stuck while executing "su"? Or is that because no exit code is being returned?

Regards

Mateusz Glowinski

On 28.12.2018 23:49, Jeff Forcier wrote:

Hi Mateusz,

 

The problem with `su` is that it spawns a new interactive shell, expecting a human user to continue interacting with that shell during a single overall SSH session. Tools like Fabric spawn a new session for every new `run()` or similar, as described in this FAQ:

 

 

Going by my local `man su` it looks like `su` can take a `-c` argument to run its subshell that way (same as directly running the user's login shell with `-c`, which usually means "run this one interpreted string and exit").

 

So at a basic level you should be able to solve this by replacing:

 

    dss.run("su", watchers=[...])

    dss.run("whoami")

 

with:

 

    dss.run("su -c whoami", watchers=[...])

 

though you'd necessarily need to have ALL subsequent commands mixing in the `su -c` and `watchers=` bits; possibly a good spot for a subroutine or subclass method.

 

We've got a `prefix` context manager that works well for commands that can be strung together with `&&`, but we don't yet have an equivalent for this sort of use case. We'll probably get one eventually!

 

Best,

Jeff

 

 

On Fri, Dec 28, 2018 at 5:17 PM Mateusz <address@hidden> wrote:

Hi There,

I'm trying to use fabric library to control subprocesson on linux device. I've prepared a piece of code, which intention is to log as a root user.
I can't use "sudo" method because that is not existing on the system that i want to control. Also logging directly as "root" is impossible. My idea is to log as a "admin" user and then use "su" command to switch to "root" user.

Code:

from fabric import Connection
from invoke import Responder
 
sudopass = Responder(pattern=r'Password:', response='adminPassword\n')
 
with Connection('192.168.0.106', user="admin", port=22, connect_kwargs={"password": "admin"}) as dss:
    command = "uname -s"
    print("Response on {} is: {}".format(command, dss.run(command)))
    command = "whoami"
    print("Response on {} is: {}".format(command, dss.run(command)))
    command = "su"
    print("Response on {} is after executing su command: {}".format(command,
                                                                    dss.run(command, pty=True, watchers=[sudopass])))
    command = "whoami"
    print("Response on {} is: {}".format(command, dss.run(command)))
print("Script end")

Output:

Linux
Response on uname -s is: Command exited with status 0.
=== stdout ===
Linux
 
(no stderr)
dssadmin
Response on whoami is: Command exited with status 0.
=== stdout ===
dssadmin
 
(no stderr)
Password: 
/home/dssadmin # 

As you can see script got stuck after sending "su" command. Any ideas how to solve that?

I'm using:
Python 3.7
Fabric 2.4.0

 

Thanks in advance

Mateusz Glowinski

_______________________________________________
Fab-user mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/fab-user


 

--

Jeff Forcier
Unix sysadmin; Python engineer
http://bitprophet.org


 

--

Jeff Forcier
Unix sysadmin; Python engineer
http://bitprophet.org


reply via email to

[Prev in Thread] Current Thread [Next in Thread]