Fabric: Не удалось `context.put` файл с `sudo`.

Созданный на 14 мая 2018  ·  3Комментарии  ·  Источник: fabric/fabric

В v2 параметр use_sudo=True больше не существует.
Если я попытаюсь скопировать файл на удаленный хост, вот что я получу:

Traceback (most recent call last):
  File "env/bin/fab", line 9, in <module>
    load_entry_point('fabric==2.0.0', 'console_scripts', 'fab')()
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/program.py", line 332, in run
    self.execute()
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/program.py", line 480, in execute
    executor.execute(*self.tasks)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/executor.py", line 133, in execute
    result = call.task(*args, **call.kwargs)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/tasks.py", line 127, in __call__
    result = self.body(*args, **kwargs)
  File "/home/tim/Workspace/wintest/fabfile.py", line 131, in nginx
    context.put(StringIO(nginx_conf), remote='/etc/nginx/sites-enabled/website')
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/fabric/connection.py", line 639, in put
    return Transfer(self).put(*args, **kwargs)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/fabric/transfer.py", line 213, in put
    sftp.putfo(fl=local, remotepath=remote)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 683, in putfo
    with self.file(remotepath, 'wb') as fr:
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 341, in open
    t, msg = self._request(CMD_OPEN, filename, imode, attrblock)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 863, in _convert_status
    raise IOError(errno.EACCES, text)
PermissionError: [Errno 13] Permission denied

Самый полезный комментарий

@geoffrey-eisenbarth На данный момент для этого нет «благословенного» подхода - см. Немного о sudo в разделе http://www.fabfile.org/upgrading.html#file -transfer.

На данный момент вы хотели бы сделать что-то простое, например

c.put("path/to/local/nginx.conf") # implicit to remote $HOME
c.sudo("mv nginx.conf /etc/nginx/") # again implicitly with a CWD of $HOME

Все 3 Комментарий

Это задокументировано в http://docs.fabfile.org/en/latest/upgrading.html#id15. Кажется, нет хорошей замены одной команды для этого — например, вы не можете использовать c.sudo("install … /dev/stdin /path/to/remote") — и, похоже, в sudo() есть ошибка, которая не позволяет использовать tee (он никогда не завершается и просто оставляет команду висящей в ожидании ввода).

Вот то, что я использовал для танцев с временными файлами, что, возможно, вы всегда должны делать в любом случае, чтобы не оставлять файлы с непреднамеренными разрешениями:

def sudo_install(connection, source, dest, *, owner='root', group='root', mode='0600'):
    """
    Helper which installs a file with arbitrary permissions and ownership

    This is a replacement for Fabric 1's `put(…, use_sudo=True)` and adds the
    ability to set the expected ownership and permissions in one operation.
    """

    mktemp_result = connection.run('mktemp', hide='out')
    assert mktemp_result.ok

    temp_file = mktemp_result.stdout.strip()

    try:
        connection.put(source, temp_file)
        connection.sudo(f'install -o {owner} -g {group} -m {mode} {temp_file} {dest}')
    finally:
        connection.run(f'rm {temp_file}')

Вызывается, например,

<strong i="14">@task</strong>
def install_mount_status_monitor(conn):
    sudo_install(conn, override_file, "/etc/systemd/system/mount_status_monitor.service.d/override.conf")

Это ожидаемый маршрут для использования при попытке скопировать локальный файл на удаленный сервер за пределами домашнего каталога пользователя?

Каков предполагаемый способ использования Fabric и копирования файла, скажем, в /etc/nginx/? Я пытаюсь найти способ Fabric2 использовать upload_template и т.д.

@geoffrey-eisenbarth На данный момент для этого нет «благословенного» подхода - см. Немного о sudo в разделе http://www.fabfile.org/upgrading.html#file -transfer.

На данный момент вы хотели бы сделать что-то простое, например

c.put("path/to/local/nginx.conf") # implicit to remote $HOME
c.sudo("mv nginx.conf /etc/nginx/") # again implicitly with a CWD of $HOME
Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

yuvadm picture yuvadm  ·  5Комментарии

Grazfather picture Grazfather  ·  4Комментарии

peteruhnak picture peteruhnak  ·  4Комментарии

jamesob picture jamesob  ·  3Комментарии

harobed picture harobed  ·  5Комментарии