我已经阅读了argparse
docs,我正在尝试创建一个接受命令行参数的程序,并将这些值传递给变量,如下所示:
ssh.py -username admin -password password -hostlist 192.168.1.1, 192.168.1.2 -commands uname -a, whoami
当我在程序中静态分配这些值时,它可以正常工作,但无论目标是列表还是单个字符串,我都无法将argpase传递给变量。
这有效:
hostlist = ['192.168.1.1','192.168.1.2']
username = 'admin'
password = 'password'
commands = ['uname -a','whoami']
这会以静默方式运行,不起作用或生成错误或写入日志文件:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '-username', help='The Username for authentication.')
parser.add_argument('-p', '-password', help='The password for authentication.')
parser.add_argument('-l', '-hostlist', nargs='+', help='List of devices to interact with.')
parser.add_argument('-c', '-commands', nargs='+', help='An exact list of commands to run')
args = parser.parse_args()
u,username = args.username
p,password = args.password
l,hostlist = args.hostlist
c,commands = args.commands
答案 0 :(得分:2)
谢谢大家!现在它似乎正常工作:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--username', action='store', dest='username', help='The ssh username.')
parser.add_argument('-p', '--password', action='store', dest='password', help='The ssh password.')
parser.add_argument('-l', '--hostlist', nargs='+',action='store', dest='hostlist', help='List of devices to interact with.')
parser.add_argument('-c', '--commands', nargs='+',action='store', dest='commands', help='An exact list of commands to run')
args = parser.parse_args()
username = args.username
password = args.password
hostlist = args.hostlist
commands = args.commands
答案 1 :(得分:1)
此代码存在一些问题,以及您如何使用它。
长选项应使用两个连字符指定:
parser.add_argument('-u', '--username', help='The Username for authentication.')
每个选项只会填充args
中的一个值,因此您不应尝试解压缩两个值。试试这个:
username = args.username
值在命令行中用空格而不是逗号分隔,因此请使用:
--hostlist 192.168.1.1 192.168.1.2
命令行中包含空格的值将在空格上拆分并解释为单独的值("单词")。要强制它们被解释为单独的单词,请将它们用引号括起来:
--commands 'uname -a' 'whoami'
或者,您可以使用反斜杠转义空格:
--commands uname\ -a whoami
答案 2 :(得分:1)
它对我有用:
import optparse
parser = optparse.OptionParser('usage%prog'+'-username <username>'+'-password<pass> '+' -localhost<localhost>' +'-commands <commands> ')
parser.add_option('-u', dest='username', help='The Username for authentication.')
parser.add_option('-p', dest='password', help='The password for authentication.')
parser.add_option('-l', dest='hostlist', help='List of devices to interact with.')
parser.add_option('-c', dest='commands', help='An exact list of commands to run')
(options,args) = parser.parse_args()
username = options.username
password = options.password
hostlist = options.hostlist
commands = options.commands
print username,password,hostlist,commands
python ssh.py -u admin -p password -l'192.168.1.1,192.168.1.2'-c'uname -a',whoami
输出:
admin password 192.168.1.1,192.168.1.2 uname -a,whoami
注意1:您可以在我的代码中将 -username 替换为 -u ,然后输入:
python ssh.py --username(以及其他选项)
note2:您使用了(192.168.1.1,192.168.1.2)和(uname -a)因为在ips中有一个空格而在( -a )中( uname -a)你的程序有问题要解决它你有两种方法:
1)移除空间使用(uname-a)或(192.168.1.1,192.168.1.2)
2)使用引号('192.168.1.1,192.168.1.2')代替(192.168.1.1,192.168.1.2)
答案 3 :(得分:0)
我猜您可以在专属于argparse
的{{3}}中找到答案。
我使用这个模块的经验不是很多,但据我所知,你应该使用类似的东西:
parser.add_argument('-u', '-username',
action='store', # tell to store a value
dest='username', # use `username` to access value
help='The Username for authentication.')
args = parser.parse_args()
username = args.username # u, username = ... should raise unpacking error
# as pointed out by hpaulj in comment