Fabric: Es ist nicht möglich, eine Datei mit „sudo“ in den Kontext zu stellen.

Erstellt am 14. Mai 2018  ·  3Kommentare  ·  Quelle: fabric/fabric

In v2 existiert der Parameter use_sudo=True nicht mehr.
Wenn ich versuche, eine Datei auf dem Remote-Host zu kopieren, erhalte ich Folgendes:

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

Hilfreichster Kommentar

@geoffrey-eisenbarth Im Moment gibt es dafür keinen "gesegneten" Ansatz - siehe den Abschnitt über sudo unter http://www.fabfile.org/upgrading.html#file -transfer

Im Moment möchten Sie etwas Grundlegendes tun, wie z

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

Alle 3 Kommentare

Dies ist in http://docs.fabfile.org/en/latest/upgrading.html#id15 dokumentiert. Es scheint keinen guten Einzelbefehl-Ersatz dafür zu geben – z. B. können Sie c.sudo("install … /dev/stdin /path/to/remote") nicht verwenden – und es scheint einen Fehler in sudo() zu geben, der die Verwendung von tee verhindert.

Hier ist, was ich verwendet habe, um den Tanz der temporären Datei zu machen, was Sie wohl sowieso immer tun sollten, um zu vermeiden, dass Dateien mit unbeabsichtigten Berechtigungen hinterlassen werden:

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}')

Aufgerufen als zB

<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")

Ist dies die erwartete Route, wenn versucht wird, eine lokale Datei auf einen Remoteserver außerhalb des Home-Verzeichnisses des Benutzers zu kopieren?

Wie soll Fabric verwendet und eine Datei beispielsweise nach /etc/nginx/? kopiert werden? Ich versuche, die Art und Weise von fabric2 zu finden, upload_template usw. zu verwenden.

@geoffrey-eisenbarth Im Moment gibt es dafür keinen "gesegneten" Ansatz - siehe den Abschnitt über sudo unter http://www.fabfile.org/upgrading.html#file -transfer

Im Moment möchten Sie etwas Grundlegendes tun, wie z

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
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

yuvadm picture yuvadm  ·  5Kommentare

SamuelMarks picture SamuelMarks  ·  3Kommentare

acdha picture acdha  ·  4Kommentare

26huitailang picture 26huitailang  ·  3Kommentare

jamesob picture jamesob  ·  3Kommentare