这段代码中的问题可能是由于client.exec_command(script_command)执行的命令没有正常结束,导致终端卡住了。可能的原因包括:

  1. script_command中的脚本命令没有正确执行完毕,导致没有返回结果。
  2. script_command中的脚本命令执行时间过长,导致终端一直等待返回结果。
  3. script_command中的脚本命令在执行过程中出现了错误,没有返回结果。

为了调试这个问题,你可以尝试以下方法:

  1. 检查script_command中的脚本命令是否正确,是否可以在终端中手动执行并返回结果。
  2. 尝试将script_command中的脚本命令修改为简单的命令,例如ls,看是否可以正常返回结果。
  3. 检查script_command中的脚本命令是否需要输入额外的参数或环境变量,以确保命令可以正确执行。
  4. 尝试增加超时参数来限制命令执行的时间,例如client.exec_command(script_command, timeout=10),如果命令执行时间超过10秒则自动结束。
  5. 检查script_command中的脚本命令是否有输出重定向或后台执行等特殊操作,这些操作可能导致命令没有返回结果。

如果以上方法都没有解决问题,你可以尝试使用invoke_shell()方法来执行命令并实时获取输出,以便更好地调试和定位问题。以下是一个示例:

def start_script_via_ssh(hostname=settings.AUTODL_INSTANCE_HOSTNAME,
                         port=settings.AUTODL_INSTANCE_PORT,
                         username=settings.AUTODL_INSTANCE_USERNAME,
                         password=settings.AUTODL_INSTANCE_PASSWORD,
                         script_command='bash /root/init/start.sh; exit'):
    # 创建 SSH 客户端对象
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 连接 SSH 服务器
    client.connect(hostname=hostname, port=int(port),
                   username=username, password=password)

    print('client', client)

    try:
        # 打开一个新的 Channel
        channel = client.invoke_shell()
        
        # 执行启动脚本命令
        channel.send(script_command + '\n')

        # 逐行读取输出
        while True:
            if channel.recv_ready():
                output = channel.recv(1024).decode()
                print(output, end='')
            if channel.exit_status_ready():
                break

    finally:
        # 关闭 SSH 连接
        client.close()

通过使用invoke_shell()方法和循环读取输出,可以实时获取命令的输出,并在命令执行完毕后退出循环,以避免终端卡住。

以下代码是通过django的接口触发的但是它好像会卡在printclient client即打印信息后终端就不会动了:def start_script_via_ssh hostname=settingsAUTODL_INSTANCE_HOSTNAME port=settingsAUTODL_INSTANCE_PORT username=settingsAUTODL_INST

原文地址: http://www.cveoy.top/t/topic/i7BA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录