Fabric框架Connection类sudo方法密码配置及使用问题求助
Fabric框架sudo命令及sqlcmd多密码输入问题解决
问题说明
我正在使用Fabric框架通过SSH在远程机器执行命令,已实现远程连接并通过Responder处理sudo命令的密码验证。但遇到两个问题:
- 运行sqlcmd(MSSQL的CLI客户端)时,sudo密码验证后还需要输入数据库密码,添加第二个Responder无效,暂时不想使用sqlcmd的-P选项;
- 不知道如何正确给Connection类的sudo方法指定sudo密码,现有代码中sudo执行失败。
代码问题排查与修正
原代码错误点
原代码中sudo方法的调用方式错误:
c.sudo('iostat', kwargs={ "password": "H9!nrsnrsnrs"}) # 错误写法
Fabric的sudo方法不接受kwargs参数传递密码,正确的方式有两种:通过全局Config配置,或直接在sudo方法中传入password参数。
修正后的代码示例
1. 正确执行sudo命令
import getpass from fabric import Connection, Config import logging logging.basicConfig(level=logging.DEBUG) # 方式一:通过Config全局配置sudo密码 config = Config(overrides={'sudo': {'password': 'H9!nrsnrsnrs'}}) c = Connection( host='93.156.248.1', user='nnnnn', connect_kwargs={"password": "1234"}, config=config ) c.run('ls -a') # 正常执行 # 方式二:直接在sudo方法中传入password参数 c.sudo('iostat', password='H9!nrsnrsnrs')
2. 处理sqlcmd多密码输入问题
要解决sudo+sqlcmd的双重密码验证,需要确保两个Responder的正则表达式能精准匹配远程机器的提示文本(可通过DEBUG日志查看实际输出):
from fabric import Responder # 匹配sudo密码提示(注意替换成远程机器实际的提示内容) sudo_responder = Responder( pattern=r'\[sudo\] password for nnnnn:', response='H9!nrsnrsnrs\n' ) # 匹配sqlcmd的数据库密码提示(根据实际提示调整正则) sqlcmd_responder = Responder( pattern=r'Password:', response='你的数据库密码\n' ) # 执行sqlcmd命令,同时传入两个Responder c.sudo('sqlcmd -S 你的数据库地址 -U 数据库用户名', watchers=[sudo_responder, sqlcmd_responder]) c.close()
关键注意事项
- 如果添加第二个Responder无效,优先检查
pattern正则是否与远程输出的提示完全匹配(包括大小写、空格、特殊符号); - 开启DEBUG日志可以清晰看到远程返回的所有输出,方便调整正则表达式;
- 若可以使用sqlcmd的
-P参数直接指定密码,会比用Responder更简洁可靠。
内容的提问来源于stack exchange,提问作者Rusteme
相关产品推荐
相关产品推荐

