mirror of https://github.com/openspug/spug
F 修复执行发布前任务可能出现response timeout的问题
BUG原因:`_get_channel()` 这里没有考虑到应用环境变量命令长度问题,当命令在目标机执行时被截断时就会出问题,我参照 `exec_command()` 让 `_get_channel()` 这里也用一样的方式(`put_file_by_fl()`),就解决这个问题了。 另外`send()` 都调整成了 `sendall()` 防止极端情况下命令字符没有被全部发送出去而出问题。 有人曾反映过这个问题:https://github.com/openspug/spug/issues/455 ---- 相关的资料: https://unix.stackexchange.com/questions/643777/is-there-any-limit-on-line-length-when-pasting-to-a-terminal-in-linux https://stackoverflow.com/questions/18015137/linux-terminal-input-reading-user-input-from-terminal-truncating-lines-at-4095 https://github.com/torvalds/linux/blob/v5.11/drivers/tty/n_tty.c#L1681pull/509/head
parent
0061fc3c62
commit
3b918eebd1
|
@ -31,7 +31,7 @@ class SSH:
|
||||||
self.sftp = None
|
self.sftp = None
|
||||||
self.exec_file = None
|
self.exec_file = None
|
||||||
self.eof = 'Spug EOF 2108111926'
|
self.eof = 'Spug EOF 2108111926'
|
||||||
self.default_env = self._make_env_command(default_env)
|
self.default_env = default_env
|
||||||
self.regex = re.compile(r'Spug EOF 2108111926 (-?\d+)[\r\n]?')
|
self.regex = re.compile(r'Spug EOF 2108111926 (-?\d+)[\r\n]?')
|
||||||
self.arguments = {
|
self.arguments = {
|
||||||
'hostname': hostname,
|
'hostname': hostname,
|
||||||
|
@ -83,7 +83,7 @@ class SSH:
|
||||||
def exec_command(self, command, environment=None):
|
def exec_command(self, command, environment=None):
|
||||||
channel = self._get_channel()
|
channel = self._get_channel()
|
||||||
command = self._handle_command(command, environment)
|
command = self._handle_command(command, environment)
|
||||||
channel.send(command)
|
channel.sendall(command)
|
||||||
out, exit_code = '', -1
|
out, exit_code = '', -1
|
||||||
for line in self.stdout:
|
for line in self.stdout:
|
||||||
match = self.regex.search(line)
|
match = self.regex.search(line)
|
||||||
|
@ -112,7 +112,7 @@ class SSH:
|
||||||
def exec_command_with_stream(self, command, environment=None):
|
def exec_command_with_stream(self, command, environment=None):
|
||||||
channel = self._get_channel()
|
channel = self._get_channel()
|
||||||
command = self._handle_command(command, environment)
|
command = self._handle_command(command, environment)
|
||||||
channel.send(command)
|
channel.sendall(command)
|
||||||
exit_code, line = -1, ''
|
exit_code, line = -1, ''
|
||||||
while True:
|
while True:
|
||||||
line = self._decode(channel.recv(8196))
|
line = self._decode(channel.recv(8196))
|
||||||
|
@ -153,14 +153,14 @@ class SSH:
|
||||||
counter = 0
|
counter = 0
|
||||||
self.channel = self.client.invoke_shell()
|
self.channel = self.client.invoke_shell()
|
||||||
command = 'set +o history\nset +o zle\nset -o no_nomatch\nexport PS1= && stty -echo\n'
|
command = 'set +o history\nset +o zle\nset -o no_nomatch\nexport PS1= && stty -echo\n'
|
||||||
if self.default_env:
|
command = self._handle_command(command, self.default_env)
|
||||||
command += f'{self.default_env}\n'
|
self.channel.sendall(command)
|
||||||
command += f'echo {self.eof} $?\n'
|
out = line = ''
|
||||||
self.channel.send(command.encode())
|
|
||||||
while True:
|
while True:
|
||||||
if self.channel.recv_ready():
|
if self.channel.recv_ready():
|
||||||
line = self._decode(self.channel.recv(8196))
|
line = self._decode(self.channel.recv(8196))
|
||||||
if self.regex.search(line):
|
out += line
|
||||||
|
if self.regex.search(out):
|
||||||
self.stdout = self.channel.makefile('r')
|
self.stdout = self.channel.makefile('r')
|
||||||
break
|
break
|
||||||
elif counter >= 100:
|
elif counter >= 100:
|
||||||
|
|
Loading…
Reference in New Issue