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.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:
|
||||
|
|
Loading…
Reference in New Issue