我正在运行一个userA与root访问一样的脚本,从这个脚本我想popen()打电话并运行一个不同的进程userB.
os.setuid()似乎不适用于此(除非我这样做错了吗?),我想避免基于linux的解决方案,如 su -userB -c <command>
userB在脚本运行时是否有运行进程的pythonic方法userA?
我目前正在尝试执行以下操作:
cmd = r'sudo sed -irn "1!N; s/<ip>127.0.0.1<\/ip>(\n.*4000.*)/<ip>0.0.0.0<\/ip>\1/" /usr/something.conf'
subprocess.Popen(cmd)
Run Code Online (Sandbox Code Playgroud)
然而,Popen抱怨说\\ 1是无效的引用.在pdb中检查它我看到了,
'sudo sed -irn "1!N; s/<ip>127.0.0.1<\\/ip>(\\n.*4000.*)/<ip>0.0.0.0<\\/ip>\\1/" /usr/something.conf'
Run Code Online (Sandbox Code Playgroud)
好像python正在添加一个额外的\.有没有办法防止这种情况,以便我可以像使用Popen一样运行命令?
此外,为简化起见,我将其排除在示例之外,但实际上这是在传递给Popen之前将其包装在SSH调用中,所以是的......它确实需要用Popen和完成sed.
这里参考的是字符串经过的完整步骤链...
def _formatCmd(cmdString, host=None, user=None, keyfile=None):
cmd = []
if host:
cmd.append('ssh')
keyfile = keyfile or getKeyFile()
if keyfile:
cmd.append('-i')
cmd.append(keyfile)
cmd.append("%s@%s" % (user, host))
cmd.append(cmdString)
else:
cmd += cmdString.split()
return cmd
def runCmd(host, user, cmd, timeout=None, cleanup=False):
try:
cmd = _formatCmd(cmd, host=host, user=user)
except:
pass
#create cmd and add it to list of …Run Code Online (Sandbox Code Playgroud) 我希望能够将一个字符串拆分成一个不是数字或点的任何东西的列表.目前split方法只提供了一种做出积极匹配的方法,是一种正则表达式在这种情况下采取的最佳途径吗?
例如,给定字符串"10.23, 10.13.21; 10.1 10.5 and 10.23.32"
This应该返回列表['10.23', '10.13.21', '10.1', '10.5', '10.23.32']
因此我相信在这种情况下使用的最佳正则表达式将是...
[\d\.]+
这是处理这种情况的最佳方法吗?
我有一个字符串'x = 1',我希望能够替换单个'='字符的所有出现'=='.但是,如果给出字符串,'x == 1'我想保持原样.字符串也不能完美地格式化,'x =1' '1=x' and 'x= 1'都是有效的输入.
我无法使用,string.replace('=', '==')因为它会将'x == 1'字符串转换为'x ==== 1'
我尝试使用正则表达式并向前看,re.sub(r'=(?!=)', '==', string)但是对于'x == 1'它产生的字符串'x === 1',因为前瞻不会消耗第二个=所以正则表达式在忽略第一个=之后继续查找并替换它.
有谁知道解决这个问题的好方法?