Файл сценария python scp с пробелами в имени файла
Я пытаюсь скопировать файлы в локальной сети с помощью scp.
Он хорошо работает с именами файлов без пробелов, но с ним происходит сбой.
Я попытался заменить "на" \ ", как это пример, но он не работает.
Вот мой код:
def connection(locals):
a = (int(re.search(br'(\d+)%$', locals['child'].after).group(1)))
print a
perc = (Decimal(a)/100)
print (type(perc)), perc
while gtk.events_pending():
gtk.main_iteration()
FileCopy.pbar.set_text("Copy of the file in the Pi... " + str(a) + "%")
while gtk.events_pending():
gtk.main_iteration()
FileCopy.pbar.set_fraction(perc)
file_pc = "/home/guillaume/folder/a very large name of file with space .smthg"
file_pi = "[email protected]:/home/pi/folder/a very large name of file with space .smthg"
if " " in file_pc:
file_pc = fichier_pc.replace(" ", '\\\ ') # tried '\\ ' or '\ '
file_pi = fichier_pi.replace(" ", '\\\ ') # but no way
else:
pass
command = "scp %s %s" % tuple(map(pipes.quote, [file_pc, file_pi]))
pexpect.run(command, events={r'\d+%': connection}) # this command is using to get the %
Как я могу исправить эту проблему?
Благодаря
Ответы
Ответ 1
Вы можете сохранить локальный файл file_pc
as is (pipes.quote
, чтобы избежать пробелов). Удаленный файл следует изменить:
import pipes
file_pi = '[email protected]:/home/pi/folder/file with space.smth'
host, colon, path = file_pi.partition(':')
assert colon
file_pi = host + colon + pipes.quote(path)
i.e., [email protected]:/path/with space
следует изменить на [email protected]:'/path/with space'
Ответ 2
Используйте модуль subprocess
и/или shlex.split()
:
import subprocess
subprocess.call(['scp', file_pc, file_pi])
и вам не нужно беспокоиться об экранировании или цитировании чего-либо
Ответ 3
Возможно, вы захотите изучить fabric, библиотеку Python, которая упрощает использование SSH.
from fabric.state import env
from fabric.operations import get
env.user = 'username'
env.key_filename = '/path/to/ssh-key'
get('/remote_path/*', 'local_path/')