Fabric: معالجة إدخال غريبة على Windows في Fab2

تم إنشاؤها على ١٤ سبتمبر ٢٠١٨  ·  11تعليقات  ·  مصدر: fabric/fabric

يتعامل القماش 1 مع الإدخال اليدوي بشكل صحيح ، لكن القماش 2 يتصرف بشكل غريب ، مع pty أو بدونه.

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

# contents of test_input.sh
# #!/bin/bash
# read -p "enter value: " var
# echo "you entered $var"

# Fabric 1 handled input correctly
>>> run("~/test_input.sh")
[riskapp.comm.equabank.loc] run: ~/test_input.sh
[riskapp.comm.equabank.loc] Login password for 'user':
[riskapp.comm.equabank.loc] out: enter value: foo # typed "foo" ENTER
[riskapp.comm.equabank.loc] out: you entered foo
[riskapp.comm.equabank.loc] out:

'enter value: foo\r\nyou entered foo'

# Fabric 2 without pty doesn't show prompt and behaves strange, must hit enter twice to finish command
>>> c = Connection(SERVER, connect_kwargs={"password": PASSWORD})
>>> c.run("~/test_input.sh")
bar # typed "bar" ENTER
bar # only "b" appeared, the rest after another ENTER


you entered bar
<Result cmd='~/test_input.sh' exited=0>

# Fabric 2 with pty shows prompt but input behavior is still strange, still must hit enter twice
>>> c.run("~/test_input.sh", pty=True)
enter value: baz  # typed "baz" ENTER
b  # another ENTER
az

you entered baz
<Result cmd='~/test_input.sh' exited=0>

# Fabric 2 automatic response works ok with pty
>>> c.run("~/test_input.sh", pty=True, watchers=[Responder(pattern="enter value", response="foo\n")])
enter value: foo
you entered foo
<Result cmd='~/test_input.sh' exited=0>

تم الاختبار على Windows 7 64b in cmd، Python 3.7 64b، مع إصدارات Fabric:
Fabric3 1.14.post1 ، Fabric 2.3.1 ، Paramiko 2.4.1 ، Invoke 1.1.1

Bug Needs investigation Nonstandard platforms

التعليق الأكثر فائدة

هنا تغيير كسر في الاستدعاء من 1.2 إلى 1.3 verion.
https://github.com/pyinvoke/invoke/issues/654

ال 11 كومينتر

شكرا على التقرير. أنا غير قادر على إجراء التشخيص على أنظمة Windows بنفسي ولكن آمل أن يتمكن شخص آخر من التكاثر. أستطيع أن أقول أننا قمنا بالتأكيد بسحق عدد من المشكلات المتعلقة بالمحطات الطرفية والتشفير المتعلقة بـ Windows في الماضي ، لذا يجب أن تكون الأشياء _يجب أن تكون مستقرة جدًا هناك ، ولكن ربما تكون قد وجدت واحدة أخرى.

سؤال آخر أثارته بطاقة أخرى - هل حدث هذا دائمًا أم أنه بدأ مؤخرًا فقط؟ أبلغ مستخدم آخر عن سلوك غريب (لكنه يختلف عن هذا العرض المبلغ عنه) بعد تحديث Windows حديثًا.

لا أستطيع أن أقول ما إذا كان قد بدأ مؤخرًا أم لا ، لأنني لم أختبره من قبل.
لقد جربته الآن على Windows 10 في Python 3.5.3 ولم يتغير.
لقد جربته عدة مرات وبمجرد أن انتهى الأمر بهذا الخطأ:

>>> c.run("~/test_input.sh")
asv  # i typed "asv" ENTER
asv  # another ENTER
you entered asv

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<decorator-gen-3>", line 2, in run
  File "C:\Python35\lib\site-packages\fabric2\connection.py", line 30, in opens
    return method(self, *args, **kwargs)
  File "C:\Python35\lib\site-packages\fabric2\connection.py", line 702, in run
    return self._run(self._remote_runner(), command, **kwargs)
  File "C:\Python35\lib\site-packages\invoke\context.py", line 101, in _run
    return runner.run(command, **kwargs)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 271, in run
    return self._run_body(command, **kwargs)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 365, in _run_body
    raise ThreadException(thread_exceptions)
invoke.exceptions.ThreadException:
Saw 1 exceptions within threads (OSError):

Thread args: {'kwargs': {'echo': None,
            'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='cp852'>,
            'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp852'>},
 'target': <bound method Runner.handle_stdin of <fabric2.runners.Remote object at 0x000001BF0189C908>>}

Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\invoke\util.py", line 233, in run
    super(ExceptionHandlingThread, self).run()
  File "C:\Python35\lib\threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 648, in handle_stdin
    self.write_proc_stdin(data)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 784, in write_proc_stdin
    self._write_proc_stdin(data.encode(self.encoding))
  File "C:\Python35\lib\site-packages\fabric2\runners.py", line 69, in _write_proc_stdin
    return self.channel.sendall(data)
  File "C:\Python35\lib\site-packages\paramiko\channel.py", line 846, in sendall
    sent = self.send(s)
  File "C:\Python35\lib\site-packages\paramiko\channel.py", line 801, in send
    return self._send(s, m)
  File "C:\Python35\lib\site-packages\paramiko\channel.py", line 1180, in _send
    raise socket.error("Socket is closed")

OSError: Socket is closed

أهلا،

أي إصلاح عليه. لدينا نفس المشكلة كما هو موضح أعلاه.

2019-08-07 11: 31: 30،590 - vm-1.0-GA-x86_64-Minimal-template-1.0-Update-917-1565202528 - INFO - exec [cd / root || خروج $ ؟؛ mkdir -m 777 -p / mnt / shared-1565202528]
testlist: {'tests': [{'test_catagory': 'Upgrade'، 'test_json': 'runlists / Upgrade.json'، 'priority': 'P0'}]}
Traceback (أحدث مكالمة أخيرة):
ملف "harness.py" ، سطر 395 ، بتنسيق
رئيسي()
ملف "harness.py" ، السطر 392 ، بشكل رئيسي
sys.exit (harness.start_run ())
ملف "harness.py" ، السطر 59 ، في start_run
result_map = self.run ()
ملف "harness.py" ، السطر 84 ، قيد التشغيل
result_map [test ['test_catagory']] = self.run_tests (اختبار)
ملف "harness.py" ، السطر 127 ، في اختبارات التشغيل
self.mount_storage_on_vm (vm_object)
ملف "harness.py" ، سطر 241 ، في mount_storage_on_vm
"mkdir -m 777 -p٪ s"٪ (self.log_location)). return_code == 0:
ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/guest.py" ، السطر 36 ، في run_with_cd
return conn.run ("cd {} || exit $ ؟؛ {}". format (quote (dir)، command)، * args)ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/vm.py" ، السطر 242 ، في _pre_runreturn _orig_run (الأمر ، * kwargs)
ملف ""، السطر 2 ، قيد التشغيل
ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py" ، السطر 30 ، مفتوح
طريقة الإرجاع (self، args، * kwargs)
ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py" ، السطر 702 ، قيد التشغيل
إرجاع self._run (self._remote_runner () ، الأمر ، * kwargs)ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/context.py" ، السطر 101 ، في _runreturn runner.run (الأمر ، * kwargs)
ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py" ، السطر 291 ، قيد التشغيل
return self._run_body (الأمر ، ** kwargs)
ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py" ، السطر 399 ، في _run_body
رفع ThreadException (thread_exceptions)
استدعاء الاستثناءات.
شاهد 1 استثناءات داخل السلاسل (NotImplementedError):

وسائط الموضوع: {'kwargs': {'echo': بلا ،
'input_': <_io.textiowrapper i = "44"> ،
'الإخراج': <_io.textiowrapper i = "46">} ،
'استهداف':>}

Traceback (أحدث مكالمة أخيرة):

ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/util.py" ، السطر 233 ، قيد التشغيل
super (ExceptionHandlingThread، self). تشغيل ()

ملف "/usr/lib/python3.6/threading.py" ، السطر 864 ، قيد التشغيل
self._arget ( self._args، * self._kwargs)

ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py" ، السطر 706 ، في handle_stdin
self.close_proc_stdin ()

ملف "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py" ، السطر 939 ، في close_proc_stdin
رفع NotImplementedError

NotImplementedError. خطأ

حدثت نفس المشكلة في 2019/08/07

def ssh_login_target_nas():
    """ Use ssh to login the target NAS 

        return 
            type: <class 'fabric.connection.Connection'>
    """
    # Set up fabric's login information
    host = SSH_ACCOUNT + "@" + SELF_NAS_IP_ADDRESS              
    # Connect to your nas
    c = Connection(host = host, connect_kwargs={"password": SSH_ACCOUNT_PASSWORD})
    try:
        hostname = c.run('hostname').stdout.strip()
        logger.debug("Connect to NAS: " + hostname)
    except Exception, error:
        logger.error(error)
        raise SystemExit
    return c

يمكنني الحصول على اسم المضيف من stdout. لكن ما زلت أحصل على الاستثناء كما هو موضح أدناه.

05:57:13 [ERROR] - 2019-08-08 05:58:17,108 - auto_update: ssh_login_target_nas 54   - 
05:57:13 Saw 1 exceptions within threads (NotImplementedError):
05:57:13 
05:57:13 
05:57:13 Thread args: {'kwargs': {'echo': None,
05:57:13             'input_': <open file '<stdin>', mode 'r' at 0x7fbf8f39b0c0>,
05:57:13             'output': <open file '<stdout>', mode 'w' at 0x7fbf8f39b150>},
05:57:13  'target': <bound method Remote.handle_stdin of <fabric.runners.Remote object at 0x7fbf8c6d3e10>>}
05:57:13 
05:57:13 Traceback (most recent call last):
05:57:13 
05:57:13   File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/util.py", line 233, in run
05:57:13     super(ExceptionHandlingThread, self).run()
05:57:13 
05:57:13   File "/usr/lib/python2.7/threading.py", line 754, in run
05:57:13     self.__target(*self.__args, **self.__kwargs)
05:57:13 
05:57:13   File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/runners.py", line 706, in handle_stdin
05:57:13     self.close_proc_stdin()
05:57:13 
05:57:13   File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/runners.py", line 939, in close_proc_stdin
05:57:13     raise NotImplementedError
05:57:13 
05:57:13 NotImplementedError

المحتوى الخاص بي من requirements.txt كما يلي:

requests==2.11.1
fabric==2.4.0
xmltodict

لقد اكتشفت أنني سأقوم بتثبيت إصدار مختلف من الحزم بعد تنفيذ pip install -r requirements.txt منذ 2019/08/07.

2019/08/06.

Successfully installed asn1crypto-0.24.0 bcrypt-3.1.7 cffi-1.12.3 cryptography-2.7 enum34-1.1.6 fabric-2.4.0 invoke-1.2.0 ipaddress-1.0.22 paramiko-2.6.0 pycparser-2.19 pynacl-1.3.0 requests-2.11.1 six-1.12.0 xmltodict-0.12.0

2019/08/07.

Successfully installed asn1crypto-0.24.0 bcrypt-3.1.7 cffi-1.12.3 cryptography-2.7 enum34-1.1.6 fabric-2.4.0 invoke-1.3.0 ipaddress-1.0.22 paramiko-2.6.0 pycparser-2.19 pynacl-1.3.0 requests-2.11.1 six-1.12.0 xmltodict-0.12.0

إصدار حزمة الاستدعاء مختلف.

هنا تغيير كسر في الاستدعاء من 1.2 إلى 1.3 verion.
https://github.com/pyinvoke/invoke/issues/654

بحث رائع baconYao ، كان هذا

نفس الشيء هنا ، عند الضغط على أي مفتاح في تشغيل مهمة مترابطة باستمرار ، أحصل على خطأ في المقبس.

Saw 1 exceptions within threads (OSError):

Thread args: {'kwargs': {'echo': None,
            'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>,
            'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>},
 'target': <bound method Runner.handle_stdin of <fabric.runners.Remote object at 0x7fcad97aeed0>>}

Traceback (most recent call last):

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/util.py", line 233, in run
    super(ExceptionHandlingThread, self).run()

  File "/usr/lib64/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/runners.py", line 694, in handle_stdin
    self.write_proc_stdin(data)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/runners.py", line 832, in write_proc_stdin
    self._write_proc_stdin(data.encode(self.encoding))

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/fabric/runners.py", line 67, in _write_proc_stdin
    return self.channel.sendall(data)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 846, in sendall
    sent = self.send(s)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 801, in send
    return self._send(s, m)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 1198, in _send
    raise socket.error("Socket is closed")

OSError: Socket is closed

عانيت من نفس المشكلة مع 2.4.0. كنت أستخدم فاب داخل مهمة الكرفس. لسبب ما ، الترقية إلى 2.5.0 تحلها.

يمكن أيضًا توصيل هذه المشكلة ببيئات Windows أو WSL. كان لدينا نفس نظام Stacktrace باستخدام أحدث Ubuntu WSL على أحدث نظام Windows 10 ، وقمنا بحلها عن طريق تشغيل مهامنا على macOS.
ترقية النسيج أو تخفيضه و / أو الاستدعاء كما هو مذكور أعلاه لم يعمل بالنسبة لنا.

الشيء الغريب هو أن معظم المهام عملت أيضًا على WSL ، فقط مهمة طويلة جدًا (العديد من أوامر التشغيل ()) فشلت مع هذا الاستثناء غير الحتمي ، أي بعد تشغيل عدد غير مؤكد من الأوامر.

أنا سعيد للغاية لأنني تمكنت من العثور على هذا.

في مزيد من التحقيق ، يمكن أيضًا ربطها بفئة المستجيب. استخدمنا مجيبًا للإجابة بـ "نعم" على اثنين من أوامر .run () المتتالية السريعة ، وقد يفشل هذا في WSL. تعمل إزالة كائنات المستجيب واستدعاء "نعم | الأمر" بدلاً من ذلك على WSL أيضًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات