ν¨λΈλ¦ 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μμ cmd, Python 3.7 64b, Fabric λ²μ μμ ν
μ€νΈλμμ΅λλ€.
Fabric3 1.14.post1, Fabric 2.3.1, Paramiko 2.4.1, Invoke 1.1.1
μ κ³ ν΄ μ£Όμ μ κ°μ¬ν©λλ€. Windows μμ€ν μμ μ§μ μ§λ¨μ μν ν μλ μμ§λ§ λ€λ₯Έ μ¬λμ΄ μ¬ν ν μ μκΈ°λ₯Ό λ°λλλ€. κ³Όκ±°μ Windowsμ κ΄λ ¨λ μ¬λ¬ ν°λ―Έλ λ° μΈμ½λ© κ΄λ ¨ λ¬Έμ λ₯Ό νμ€ν μ²λ¦¬ νμΌλ―λ‘ μν©μ΄ κ½€ μμ μ μ΄μ΄μΌνμ§λ§ λ€λ₯Έ λ¬Έμ λ₯Ό λ°κ²¬νμ μ μμ΅λλ€.
λ€λ₯Έ ν°μΌμ μν΄ μ λ° λ λ λ€λ₯Έ μ§λ¬Έ-νμ λ°μ νμ΅λκΉ μλλ©΄ μ΅κ·Όμ μμ λμμ΅λκΉ? λ€λ₯Έ μ¬μ©μκ° μ΅κ·Ό Windows μ λ°μ΄νΈ ν μ΄μν λμ (μ΄λ³΄κ³ λ μ¦μκ³Όλ λ€λ¦)μλ³΄κ³ νμ΅λλ€.
λλ κ·Έκ²μ΄ μ΅κ·Όμ μμλμλμ§ μ¬λΆλ₯Ό λ§ν μ μμ΅λλ€.
μ΄μ Python 3.5.3μ Windows 10μμ μλνμ§λ§ λ³κ²½ μ¬νμ΄ μμ΅λλ€.
λλ κ·Έκ²μ μ¬λ¬ λ² μλνκ³ μΌλ¨μ΄ μ€λ₯κ° λ°μνλ©΄ :
>>> 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-μ 보-exec [cd / root || μ’
λ£ $ ?; mkdir -m 777 -p / mnt / shared-1565202528]
ν
μ€νΈ λͺ©λ‘ : { 'tests': [{ 'test_catagory': 'upgrade', 'test_json': 'runlists / upgrade.json', 'priority': 'P0'}]}
μ μΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§) :
νμΌ "harness.py", 395 ν, in
λ³Έκ΄()
νμΌ "harness.py", 392 ν, κΈ°λ³Έ
sys.exit (harness.start_run ())
start_runμ νμΌ "harness.py", 59 ν
result_map = self.run ()
μ€νμ€μΈ νμΌ "harness.py", 84 ν
result_map [test [ 'test_catagory']] = self.run_tests (test)
run_testsμ νμΌ "harness.py", 127 ν
self.mount_storage_on_vm (vm_object)
mount_storage_on_vmμμλ "harness.py"νμΌ, 241 ν
"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_runμμreturn _orig_run (λͺ
λ Ή, * kwargs)
νμΌ "
νμΌ "/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 ν μ€ν μ€
return self._run (self._remote_runner (), command, * 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) λ°μ
invoke.exceptions.ThreadException :
μ€λ λ λ΄μμ 1 κ°μ μμΈλ₯Ό νμΈνμ΅λλ€ (NotImplementedError) :
μ€λ λ μΈμ : { 'kwargs': { 'echo': μμ,
'input_': <_io.textiowrapper i = "44">,
'μΆλ ₯': <_io.textiowrapper i = "46">},
'νμ ':
μ μΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§) :
νμΌ "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/util.py", 233 ν, μ€ν μ€
super (ExceptionHandlingThread, self) .run ()
"/usr/lib/python3.6/threading.py"νμΌ, 864 ν μ€ν μ€
self._target ( 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
2019/08/07 μ΄ν pip install -r requirements.txt
μ€ν ν λ€λ₯Έ λ²μ μ ν¨ν€μ§λ₯Ό μ€μΉνλ€λ κ²μ μμμ΅λλ€.
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
invoke ν¨ν€μ§μ λ²μ μ΄ λ€λ¦ λλ€.
λ€μμ invokeκ° 1.2μμ 1.3 λ²μ μΌλ‘ λ³κ²½λμμ΅λλ€.
https://github.com/pyinvoke/invoke/issues/654
@baconYaoλ₯Ό μ°Ύμμ , μ΄κ²μ λλ₯Ό λ§κ³ μμμ΅λλ€. μ§κΈ invokeλ₯Ό 1.2λ‘ λ€μ΄ κ·Έλ μ΄λνλ©΄μ΄ λ¬Έμ λ₯Ό 극볡νμ΅λλ€. λ§€μ° κ°μ¬.
μ¬κΈ°μμλ κ³μ μ€νλλ μ€λ λ μμ μμ ν€λ₯Ό λλ₯Ό λ μμΌ μ€λ₯κ° λ°μν©λλ€.
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μμλ κ°μ λ¬Έμ κ° λ°μνμ΅λλ€. μ λ¬λ¦¬ μμ μ fabμ μ¬μ©νκ³ μμμ΅λλ€. μ΄λ€ μ΄μ λ‘ 2.5.0μΌλ‘ μ κ·Έλ μ΄λνλ©΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
μ΄ λ¬Έμ λ Windows λλ WSL νκ²½μλ μ°κ²°λ μ μμ΅λλ€. μ΅μ Windows 10μμ μ΅μ Ubuntu WSLμ μ¬μ©νμ¬ λμΌν μ€ν μΆμ μ μννκ³ macOSμμ μμ
μ μ€ννμ¬ ν΄κ²°νμ΅λλ€.
μμμ μΈκΈ νλλ‘ ν¨λΈλ¦ μ
κ·Έλ μ΄λ λλ λ€μ΄ κ·Έλ μ΄λ λ° / λλ νΈμΆμ΄ μλνμ§ μμμ΅λλ€.
μ΄μν μ μ λλΆλΆμ μμ μ΄ WSLμμλ μλνμΌλ©° λ§€μ° κΈ΄ μμ (λ§μ run () λͺ λ Ή) λ§μ΄ μμΈμ ν¨κ» λΉ κ²°μ μ μΌλ‘ μ€ν¨νμ΅λλ€. μ¦, λΆνμ€ν μμ λͺ λ Ήμ΄ μ€ν λ νμ μ€ν¨νμ΅λλ€.
μ΄κ²μ μ°Ύμ μμμ΄μ μ λ§ κΈ°μ©λλ€.
μΆκ° μ‘°μ¬μμ Responder ν΄λμ€μ μ°κ²°ν μλ μμ΅λλ€. μλ΅μλ₯Ό μ¬μ©νμ¬ λΉ λ₯Έ μ°μ .run () λͺ λ Ή λͺ κ°μ λν΄ "μ"λΌκ³ λλ΅νλλ° WSLμμλ μ€ν¨ν©λλ€. μλ΅μ κ°μ²΄λ₯Ό μ κ±°νκ³ "yes | the-command"λ₯Ό νΈμΆνλ λμ WSLμμλ μλνμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λ€μμ invokeκ° 1.2μμ 1.3 λ²μ μΌλ‘ λ³κ²½λμμ΅λλ€.
https://github.com/pyinvoke/invoke/issues/654