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#L1681
pull/509/head
xiasf 2022-06-24 11:29:04 +08:00
parent 0061fc3c62
commit 3b918eebd1
1 changed files with 8 additions and 8 deletions

View File

@ -31,7 +31,7 @@ class SSH:
self.sftp = None
self.exec_file = None
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.arguments = {
'hostname': hostname,
@ -83,7 +83,7 @@ class SSH:
def exec_command(self, command, environment=None):
channel = self._get_channel()
command = self._handle_command(command, environment)
channel.send(command)
channel.sendall(command)
out, exit_code = '', -1
for line in self.stdout:
match = self.regex.search(line)
@ -112,7 +112,7 @@ class SSH:
def exec_command_with_stream(self, command, environment=None):
channel = self._get_channel()
command = self._handle_command(command, environment)
channel.send(command)
channel.sendall(command)
exit_code, line = -1, ''
while True:
line = self._decode(channel.recv(8196))
@ -153,14 +153,14 @@ class SSH:
counter = 0
self.channel = self.client.invoke_shell()
command = 'set +o history\nset +o zle\nset -o no_nomatch\nexport PS1= && stty -echo\n'
if self.default_env:
command += f'{self.default_env}\n'
command += f'echo {self.eof} $?\n'
self.channel.send(command.encode())
command = self._handle_command(command, self.default_env)
self.channel.sendall(command)
out = line = ''
while True:
if self.channel.recv_ready():
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')
break
elif counter >= 100: