为Linux命令编写Python脚本

2024-10-01 09:37:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个问题。我一直在努力学习Python。对于一个项目,我想为我的备份服务器制作一个ncurses GUI。我的备份服务器运行rdiff backup,我想让ncurses接受变量名并将它们插入到脚本中。我一直在努力阅读,所以我不会问愚蠢的问题。在

下面是我运行脚本的函数:

def runScript():
# Cannot concatenate 'str' and 'list' objects
#script = rdiff + rdiffArgs

script = rdiff + ' ' + rdiffVerbosity + ' ' + rdiffStatistics \
         + ' ' + clientName + '@' + clientHost + '::' + clientDir \
         + ' ' + serverDir

os.system(script)

我最初认为将所有变量添加到一个列表中,这样我就可以运行say

^{pr2}$

有没有更好的方法不需要所有的空格连接?在

谢谢你的帮助

编辑:让我把整个剧本发到现在。我不是很清楚,我真的很感谢你的帮助和耐心

  #!/usr/bin/env python



import os
import smtplib


# Global variables
rdiff = '/usr/bin/rdiff-backup'
rdiffVerbosity = '-v5'
rdiffStatistics = '--print-statistics'
emailSmtp = 'smtp.gmail.com'
smtpPort = '465'
emailUsername = 'reports'
emailPassword = '3kc9dl'
emailTo = 'user@domain.com'
emailFrom = 'internal@domain.com'
serverName = 'root'
serverHost = 'SV-Datasafe'
serverDir = '/srv/backup/SV-Samba01'
clientName = 'root'
clientHost = 'SV-Samba01'
clientDir = '/srv'
rdiffArgs = rdiffArgs = [rdiffVerbosity, rdiffStatistics, \
                         clientName + '@' + clientHost + '::' \
                         +clientDir + ' ' + serverDir]
time = ''
dateStamp = datetime.now()



def sendEmail():
    subject = dateStamp + clientName
    body = clientDir + ' on ' + clientHost + ' backed up to ' + serverName + \
           ' in the directory ' + serverDir + ' on ' + dateStamp
    message = """\
    From: %s
    To: %s
    Subject: %s
    %s
    """ % (emailFrom, emailTo, subject, body)


    deliverEmail = smtplib.SMTP(emailSmtp, port=smtpPort)
    deliverEmail.login(emailUsername, emailPassword)

def runScript():
    # Cannot concatenate 'str' and 'list' objects
    #script = rdiff + rdiffArgs

    script = rdiff + ' ' + rdiffVerbosity + ' ' + rdiffStatistics \
             + ' ' + clientName + '@' + clientHost + '::' + clientDir \
             + ' ' + serverDir

    os.system(script)

    # TODO:: Logging

Tags: comosdefscriptbackupsvrdiffclientname
3条回答

尝试使用subprocess模块并以列表形式传递参数

client = clientName + '@' + clientHost + '::' + clientDir
cmd = [rdiff, rdiffVerbosity, rdiffStatistics, client , serverDir]
p = Popen(cmd ", shell=True)
print os.waitpid(p.pid, 0)[1]

或者如果已经将参数作为列表,请使用类似的方法

^{pr2}$

使用连接路径os.path.join操作系统在

连接字符串如下:“.join(['a','b'])或“,”.join(['c','d'])

哪个部分难?我不确定我100%理解这个问题

是这个吗?在

script = rdiff + " ".join(rdiffArgs)

可以使用格式说明符

def runScript():
    script = "%s %s %s@%s %s::%s %s" %(rdiff,rdiffVerbosity,rdiffStatistics,clientName,clientHost,clientDir,serverDir)    
    os.system(script)

或者说你的rdiffArgs已经在列表中了

^{pr2}$

你可以用空格把他们连起来

rdiffArgs = ' '.join(rdiffArgs)

最后,您可能想知道,您可以在脚本中导入rdiff,因为rdiff备份是用Python编写的

from rdiff_backup.Main import Main as backup
task=['/etc', '/tmp/backup']
backup(task)

以上内容备份/etc/to/tmp/backup。这样,就不必对rdiff backup进行系统调用。当然,这取决于你。进行系统调用有时更容易

相关问题 更多 >