Fabric: Penanganan input aneh pada Windows di Fab2

Dibuat pada 14 Sep 2018  ·  11Komentar  ·  Sumber: fabric/fabric

Fabric 1 menangani input manual dengan benar, tetapi Fabric 2 berperilaku aneh, dengan pty atau tanpa.

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>

Diuji pada Windows 7 64b dalam cmd, Python 3.7 64b, dengan versi Fabric:
Fabric3 1.14.post1, Fabric 2.3.1, Paramiko 2.4.1, Invoke 1.1.1

Bug Needs investigation Nonstandard platforms

Komentar yang paling membantu

Berikut adalah perubahan pemanggilan dari 1.2 ke 1.3 verion.
https://github.com/pyinvoke/invoke/issues/654

Semua 11 komentar

Terima kasih atas laporannya. Saya tidak dapat melakukan diagnosis pada sistem Windows sendiri, tetapi mudah-mudahan orang lain dapat mereproduksi. Saya dapat mengatakan bahwa kami telah menghancurkan sejumlah masalah terkait terminal & pengkodean yang terkait dengan Windows di masa lalu sehingga hal-hal _harus_ cukup stabil di sana, tetapi Anda mungkin telah menemukan yang lain.

Pertanyaan lain yang dipicu oleh tiket lain - apakah ini selalu terjadi atau baru dimulai baru-baru ini? Pengguna lain melaporkan beberapa perilaku aneh (tetapi berbeda dari gejala yang dilaporkan ini) setelah pembaruan Windows baru-baru ini.

Saya tidak bisa mengatakan, apakah itu dimulai baru-baru ini atau tidak, karena saya belum mengujinya sebelumnya.
Sekarang saya mencobanya di Windows 10 dengan Python 3.5.3 dan tidak ada perubahan.
Saya mencobanya beberapa kali dan setelah itu berakhir dengan kesalahan ini:

>>> 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

Hai,

Perbaikan apa pun tentang itu. Kami memiliki masalah yang sama seperti yang ditunjukkan di atas.

07-08-2019 11: 31: 30.590 - vm-1.0-GA-x86_64-minimal-template-1.0-Update-917-1565202528 - INFO - exec [cd / root || keluar $ ?; mkdir -m 777 -p / mnt / shared-1565202528]
daftar pengujian: {'tests': [{'test_catagory': 'upgrade', 'test_json': 'runlists / upgrade.json', 'priority': 'P0'}]}
Traceback (panggilan terakhir terakhir):
File "harness.py", baris 395, in
utama()
File "harness.py", baris 392, di main
sys.exit (harness.start_run ())
File "harness.py", baris 59, di start_run
result_map = self.run ()
File "harness.py", baris 84, sedang dijalankan
result_map [test ['test_catagory']] = self.run_tests (test)
File "harness.py", baris 127, di run_tests
self.mount_storage_on_vm (vm_object)
File "harness.py", baris 241, di mount_storage_on_vm
"mkdir -m 777 -p% s"% (self.log_location)). return_code == 0:
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/guest.py", baris 36, di run_with_cd
return conn.run ("cd {} || exit $ ?; {}". format (quote (dir), command), * args)File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/vm.py", baris 242, dalam _pre_runreturn _orig_run (perintah, * kwargs)
File "", baris 2, di jalankan
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py", baris 30, terbuka
metode pengembalian (self, args, * kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py", baris 702, sedang dijalankan
return self._run (self._remote_runner (), perintah, * kwargs)File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/context.py", baris 101, dalam _runreturn runner.run (perintah, * kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 291, sedang dijalankan
return self._run_body (perintah, ** kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 399, dalam _run_body
naikkan ThreadException (thread_exceptions)
invoke.exceptions.ThreadException:
Melihat 1 pengecualian dalam utas (NotImplementedError):

Argumen utas: {'kwargs': {'echo': Tidak ada,
'input_': <_io.textiowrapper i = "44">,
'output': <_io.textiowrapper i = "46">},
'target':>}

Traceback (panggilan terakhir terakhir):

File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/util.py", baris 233, sedang dijalankan
super (ExceptionHandlingThread, self) .run ()

File "/usr/lib/python3.6/threading.py", baris 864, sedang dijalankan
self._target ( self._args, * self._kwargs)

File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 706, di handle_stdin
self.close_proc_stdin ()

File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 939, di close_proc_stdin
meningkatkan NotImplementedError

NotImplementedError

Masalah yang sama terjadi pada 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

Saya bisa mendapatkan nama host dari stdout. Tapi saya masih mendapat pengecualian seperti di bawah ini.

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

Konten saya dari requirement.txt seperti di bawah ini:

requests==2.11.1
fabric==2.4.0
xmltodict

Saya menemukan bahwa saya akan menginstal versi paket yang berbeda setelah menjalankan pip install -r requirements.txt sejak 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

Versi paket pemanggilan berbeda.

Berikut adalah perubahan pemanggilan dari 1.2 ke 1.3 verion.
https://github.com/pyinvoke/invoke/issues/654

great menemukan @baconYao , ini juga memblokir saya. menurunkan permintaan untuk saat ini ke 1.2 telah membuat saya melewati masalah ini. Sangat dihargai.

Sama di sini, pada setiap penekanan tombol dalam tugas berulir yang terus berjalan, saya mendapatkan kesalahan soket.

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

Saya memiliki masalah yang sama dengan 2.4.0. Saya menggunakan fab di dalam seledri. Untuk beberapa alasan, memutakhirkan ke 2.5.0 menyelesaikannya.

Masalah ini juga dapat dihubungkan ke lingkungan Windows atau WSL. Kami memiliki stacktrace yang sama menggunakan Ubuntu WSL terbaru di Windows 10 terbaru, dan menyelesaikannya dengan menjalankan tugas kami di macOS.
Upgrade atau downgrade kain dan atau permintaan seperti yang disebutkan di atas tidak berhasil untuk kami.

Hal yang aneh adalah, bahwa sebagian besar tugas juga bekerja pada WSL, hanya tugas yang sangat panjang (banyak perintah run ()) yang gagal dengan pengecualian ini secara non-deterministik, yaitu, setelah sejumlah perintah yang tidak pasti dijalankan.

Saya sangat senang bisa menemukan ini.

Pada penyelidikan lebih lanjut, itu juga bisa dihubungkan ke kelas Responder. Kami menggunakan responder untuk menjawab "ya" pada beberapa perintah .run () yang berurutan secara cepat, dan ini akan gagal di WSL. Menghapus objek Responder dan memanggil "yes | the-command" juga berfungsi di WSL.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

bitprophet picture bitprophet  ·  6Komentar

acdha picture acdha  ·  4Komentar

SamuelMarks picture SamuelMarks  ·  3Komentar

Grazfather picture Grazfather  ·  4Komentar

shadyabhi picture shadyabhi  ·  5Komentar