如何在Paramiko中实现ssh -t bash的等效功能?
在Paramiko中指定启动bash shell解决专有shell无法执行命令的问题
你可以通过两种方式实现终端ssh username@device.com -t bash的效果,强制远程端启动bash shell而非专有shell:
方法一:使用exec_command执行bash并请求伪终端
这种方式适合执行单条或批量命令,通过get_pty=True模拟终端的-t参数,直接启动bash:
ssh_transfer = paramiko.SSHClient() ssh_transfer.set_missing_host_key_policy(paramiko.AutoAddPolicy) ssh_transfer.connect(hostname=device, port=22, username=username, key_filename=private_key_name) # 启动bash并分配伪终端 stdin, stdout, stderr = ssh_transfer.exec_command('bash', get_pty=True) # 示例:发送命令并读取输出 stdin.write('ls -l\n') stdin.flush() # 获取命令执行结果 print("标准输出:\n", stdout.read().decode()) print("错误输出:\n", stderr.read().decode()) ssh_transfer.close()
方法二:创建交互式shell后切换到bash
如果需要持续的交互式会话,可以先创建shell再发送bash命令切换:
ssh_transfer = paramiko.SSHClient() ssh_transfer.set_missing_host_key_policy(paramiko.AutoAddPolicy) ssh_transfer.connect(hostname=device, port=22, username=username, key_filename=private_key_name) # 初始化交互式shell shell = ssh_transfer.invoke_shell() # 发送bash命令切换shell shell.send('bash\n') # 等待切换完成(根据网络情况调整延时) import time time.sleep(1) # 示例:执行命令并读取输出 shell.send('pwd\n') time.sleep(1) output = shell.recv(65535).decode() print(output) ssh_transfer.close()
核心逻辑是模拟终端-t bash的行为:通过get_pty=True(方法一)或交互式shell(方法二)分配伪终端,同时明确指定启动bash替代默认的专有shell。
内容的提问来源于stack exchange,提问作者rogueakula
相关产品推荐
相关产品推荐

