2016-11-16 2 views
1

Я хочу использовать fabric для замены удаленной файловой строки сервера. Код ниже.Как заменить строку файла через ткань на удаленном сервере?

def readsn(): 

    with open(hn) as f: 
     while True: 
      line=f.readline() 
      if not line: 
       break 
      desthost = line.strip().lstrip().rstrip() 
      env.host_string = desthost 
      run('cp %s %s' %(path,path+time.strftime(r'%Y%m%d%H%M%S', time.localtime()))) 
      run(change_conf(path, old, new)) 

def change_conf(path,old,new): 
    f = fileinput.input(path,backup='.bak',inplace=True) 
    for line in f: 
     line = line.rstrip() 
     match = re.match(r,line) 
     if match: 
      print line.replace(old, new) 
     print line 
    f.close() 

возвращает

TypeError: cannot concatenate 'str' and 'NoneType' objects 
+0

всегда показывать полное сообщение об ошибке (traceback) в вопросе. Есть и другая полезная информация - как линия, которая создает проблему. – furas

+0

Если удаленный сервер использует Linux, тогда вы можете использовать команды Linux в базе данных - т. Е. 'sed' (** S ** tream ** ED ** itor) -' пример: sed 's/old_text/new_text/g "old_file> new_file' – furas

+0

run (change_conf (путь, старый, новый)) показывает полный поток ошибка – Flasking

ответ

1

run() ожидает строку с командой. Он может запускать только программы/скрипты, которые находятся на удаленном сервере - он не может запускать вашу функцию.

BTW: теперь Python сначала выполняет вашу функцию, которая возвращает None, а затем run() использует этот результат как команду для выполнения на сервере.

Если у вас Linux на удаленном сервере, вы можете использовать команду sed. то есть.

run('sed "s/old_text/new_text/g" old_file > new_file') 

Или вы должны скопировать скрипт на удаленном сервере, а затем запустить его


Вы также можете скачать файл с сервера (get()), изменить его локально (с помощью функции) и отправить обратно на сервере (put())

+0

спасибо за ваше время. Как я могу запустить свою функцию на удаленном сервере? Sorry newie here – Flasking

+0

Первый способ: отправить скрипт с вашей функцией на сервере ('put()') и выполнить этот скрипт на сервере с помощью 'run()' (загруженному скрипту не требуется 'run()'). Во-вторых: загрузите отредактированный файл с сервера 'get()', используйте свою функцию в этом файле локально, отправьте на сервер 'put()' – furas

-1

бег (change_conf (путь, старый, новый)) показывает текущий полный error.thankyou

Traceback (most recent call last): 
    File "change_conf_batch.py", line 45, in <module> 
    readsn() 
    File "change_conf_batch.py", line 32, in readsn 
    run(change_conf(path, old, new)) 
    File "/root/.pythonbrew/venvs/Python-2.7.10/flask/lib/python2.7/site-packages/fabric/network.py", line 677, in host_prompting_wrapper 
    return func(*args, **kwargs) 
    File "/root/.pythonbrew/venvs/Python-2.7.10/flask/lib/python2.7/site-packages/fabric/operations.py", line 1088, in run 
    shell_escape=shell_escape, capture_buffer_size=capture_buffer_size, 
    File "/root/.pythonbrew/venvs/Python-2.7.10/flask/lib/python2.7/site-packages/fabric/operations.py", line 914, in _run_command 
    _prefix_env_vars(_prefix_commands(command, 'remote')), 
    File "/root/.pythonbrew/venvs/Python-2.7.10/flask/lib/python2.7/site-packages/fabric/operations.py", line 670, in _prefix_commands 
    return prefix + command 
TypeError: cannot concatenate 'str' and 'NoneType' objects 
+0

- это решение проблемы? если нет, то удалите его и добавьте соответствующее сообщение. – furas