如何用Python模块实现远程服务器脚本运行及运行时终止输入?
实现方案
要完成远程执行脚本并处理交互式终止的需求,推荐使用paramiko模块实现SSH远程连接与交互式会话操作,以下是具体实现步骤和代码:
前置准备
先安装依赖模块:
pip install paramiko
核心实现代码
import paramiko import time def run_remote_script(hostname, username, auth_credential, remote_script_cmd): ssh = paramiko.SSHClient() # 生产环境建议替换为手动配置已知主机密钥,避免安全风险 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: # 根据认证方式连接:密码或密钥 if isinstance(auth_credential, str): # 密码认证 ssh.connect(hostname, username=username, password=auth_credential) else: # 密钥认证,传入私钥对象 ssh.connect(hostname, username=username, pkey=auth_credential) # 创建交互式Shell会话,用于处理脚本的等待输入逻辑 shell = ssh.invoke_shell() time.sleep(1) # 等待Shell初始化 # 发送远程脚本执行命令 shell.send(f"{remote_script_cmd}\n") print("远程脚本已启动,等待终止信号触发...") # 等待脚本进入等待输入状态(可根据脚本实际输出调整等待逻辑,比如检测特定输出字符串) time.sleep(2) # 发送任意内容触发终止(这里发送回车,可替换为其他字符) shell.send("\n") print("已发送终止信号,等待脚本结束...") # 持续读取输出直到会话关闭 while not shell.closed: if shell.recv_ready(): output = shell.recv(1024).decode("utf-8") print(output, end="") time.sleep(0.5) finally: ssh.close() # 调用示例 if __name__ == "__main__": # 远程服务器配置 REMOTE_HOST = "你的远程服务器IP或域名" REMOTE_USER = "服务器登录用户名" # 认证方式二选一:密码或密钥 # 密码认证: # AUTH_INFO = "你的登录密码" # 密钥认证: # from paramiko import RSAKey # AUTH_INFO = RSAKey.from_private_key_file("/path/to/your/private/key") # 远程执行命令 REMOTE_COMMAND = "python sample.py read_config.cfg MyLogs" run_remote_script(REMOTE_HOST, REMOTE_USER, AUTH_INFO, REMOTE_COMMAND)
关键说明
- 交互式会话选择:使用
invoke_shell而非exec_command,因为后者是非交互式模式,无法处理远程脚本等待用户输入的场景 - 认证方式:支持密码和密钥两种认证方式,生产环境优先使用密钥认证提升安全性
- 等待逻辑优化:示例中用
time.sleep做简单等待,实际场景可通过检测远程脚本的特定输出(比如"Press any key to exit...")来精准判断脚本是否进入等待输入状态,避免不必要的延迟 - 输出读取:循环读取输出直到会话关闭,确保捕获脚本终止过程中的所有日志
内容的提问来源于stack exchange,提问作者Nitin Sharma
相关产品推荐
相关产品推荐

