Hi Chris, Was the former, at least in my case, apologies!
Looks like this is a missing feature in 2.x, we simply aren't providing any way for you to pass that timeout parameter yet :( Your use of 'env' is unfortunately a bit off the mark, that's for shell environment variables, which doesn't help here. I searched the tracker and somebody made a ticket for this recently, which I just expanded on: https://github.com/fabric/fabric/issues/1922 The tl;dr is that the command runner level needs to understand timeouts, and then Fabric's use of that can subclass/extend such that it tickles the timeout param in paramiko.Client.exec_command. (See links in that ticket.) Best, Jeff On Tue, Jan 8, 2019 at 11:42 AM Chris Satterthwaite <ch...@cmsconstruct.com> wrote: > Is this newsgroup active? It’s been a week and I haven’t seen any > activity. > > > > Since I posted for the first time, I’m not sure if my message just hit bad > timing over holidays, or if it’s stumped folks and I should post elsewhere. > > > > Thanks! > > > > *From:* Fab-user <fab-user-bounces+chris=cmsconstruct....@nongnu.org> *On > Behalf Of *Chris Satterthwaite > *Sent:* Monday, December 31, 2018 1:06 PM > *To:* fab-user@nongnu.org > *Subject:* [Fab-user] command timeouts via Connection.run > > > > Fab community, > > > > I need some direction on getting command timeouts to work on remote SSH > commands using fabric.connection.Connection.run. I’m new to Fabric so I’m > assuming I have missed something straightforward; I appreciate any guidance > you can provide. > > > > I scripted a quick test case below, using Paramiko’s exec_command and > Fabric’s Connection.run. The command I’m sending from Windows over to a > Linux remote endpoint is 'date; sleep 3; date', and attempting to force a > timeout after 1 second. > > > > The result of the script shows the following, which illustrates Paramiko > timing out as expected, but Fabric not timing out: > > ================================================= > > Calling useFabric with timeout 1: > > {'hide': True, 'env': {'command_timeout': '1'}} > > result is ok: True > > STDOUT: Mon Dec 31 12:38:19 CST 2018 > > STDOUT: Mon Dec 31 12:38:22 CST 2018 > > useFabric runtime in seconds: 3 > > > > Calling useParamiko with timeout 1: > > STDOUT: Mon Dec 31 12:38:22 CST 2018 > > > > Timed out > > useParamiko runtime in seconds: 1 > > ================================================= > > > > > > Test script follows: > > ================================================= > > import sys > > import traceback > > import socket > > import time > > from fabric import Connection > > from paramiko.client import SSHClient, AutoAddPolicy > > > > def useFabric(): > > try: > > timeout = 1 > > client = Connection(host='192.168.121.190', user='chris', > connect_timeout='10', connect_kwargs={'password': 'changeMe!'}) > > runtimeArgs = {'hide': True, 'env': {'command_timeout' : > str(timeout)}} > > print(' {}'.format(runtimeArgs)) > > result = client.run('date; sleep 3; date', **runtimeArgs) > > print(' result is ok: {}'.format(result.ok)) > > for line in result.stdout.split('\n'): > > if len(line) > 1: > > print(' STDOUT: {}'.format(line)) > > if len(result.stderr) > 1: > > print(' STDERR: {}'.format(result.stderr)) > > except socket.timeout: > > print(' Timed out: {}'.format(str(sys.exc_info()[2]))) > > except: > > stacktrace = traceback.format_exception(sys.exc_info()[0], > sys.exc_info()[1], sys.exc_info()[2]) > > print(' Exception: {}'.format(stacktrace)) > > > > def useParamiko(): > > try: > > timeout = 1 > > client = SSHClient() > > client.load_system_host_keys() > > client.set_missing_host_key_policy(AutoAddPolicy) > > client.connect('192.168.121.190', username='chris', > password='changeMe!') > > (stdin, stdout, stderr) = client.exec_command('date; sleep 3; > date', timeout=timeout) > > for line in stdout: > > print(' STDOUT: {}'.format(line)) > > for line in stderr: > > print(' STDERR: {}'.format(line)) > > except socket.timeout: > > print(' Timed out') > > except: > > stacktrace = traceback.format_exception(sys.exc_info()[0], > sys.exc_info()[1], sys.exc_info()[2]) > > print(' Exception: {}'.format(stacktrace)) > > > > def caller(func): > > print('Calling {} with timeout 1:'.format(str(func))) > > start = time.time() > > eval(func)() > > stop = time.time() > > print(' {} runtime in seconds: {}\n'.format(func, int(stop-start))) > > > > def main(): > > caller('useFabric') > > caller('useParamiko') > > > > if __name__ == '__main__': > > main() > > ================================================= > > > > > > Lastly, here are my platform versions in case they are needed: > > Base platform (where I ran the script below): Windows 10 Pro > > Python version on the base platform: Python 3.6.1 (v3.6.1:69c0db5, Mar > 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] > > Target platform: RedHat Linux 7.5 > > Fabric version (from pip): 2.2.1 > > Paramiko version (from pip): 2.4.1 > > > > Thanks! > _______________________________________________ > Fab-user mailing list > Fab-user@nongnu.org > https://lists.nongnu.org/mailman/listinfo/fab-user > -- Jeff Forcier Unix sysadmin; Python engineer http://bitprophet.org
_______________________________________________ Fab-user mailing list Fab-user@nongnu.org https://lists.nongnu.org/mailman/listinfo/fab-user