Fabric: Impossible de `context.put` un fichier avec `sudo`.

Créé le 14 mai 2018  ·  3Commentaires  ·  Source: fabric/fabric

En v2, le paramètre use_sudo=True n'existe plus.
Si j'essaie de copier un fichier sur l'hôte distant, voici ce que j'obtiens :

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

Commentaire le plus utile

@geoffrey-eisenbarth Pour le moment, il n'y a pas d'approche "bénie" pour cela - voir le peu sur sudo sous http://www.fabfile.org/upgrading.html#file -transfer

Pour l'instant, vous voudriez faire quelque chose de basique comme

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

Tous les 3 commentaires

Ceci est documenté dans http://docs.fabfile.org/en/latest/upgrading.html#id15. Il ne semble pas y avoir de bon remplacement de commande unique pour cela - par exemple, vous ne pouvez pas utiliser c.sudo("install … /dev/stdin /path/to/remote") - et il semble y avoir un bogue dans sudo() qui empêche l'utilisation de tee (il ne se termine jamais et laisse simplement la commande en attente d'entrée).

Voici ce que j'ai utilisé pour faire la danse des fichiers temporaires, ce que vous devriez toujours faire de toute façon pour éviter de laisser des fichiers avec des autorisations involontaires :

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

Invoqué comme par exemple

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

S'agit-il de la route à utiliser lors de la tentative de copie d'un fichier local sur un serveur distant en dehors du répertoire personnel de l'utilisateur ?

Quelle est la manière prévue d'utiliser Fabric et de copier un fichier dans, par exemple, /etc/nginx/? J'essaie de trouver le moyen fabric2 d'utiliser upload_template etc.

@geoffrey-eisenbarth Pour le moment, il n'y a pas d'approche "bénie" pour cela - voir le peu sur sudo sous http://www.fabfile.org/upgrading.html#file -transfer

Pour l'instant, vous voudriez faire quelque chose de basique comme

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
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

amezin picture amezin  ·  5Commentaires

supriyopaul picture supriyopaul  ·  4Commentaires

jmcgrath207 picture jmcgrath207  ·  5Commentaires

peteruhnak picture peteruhnak  ·  4Commentaires

bitprophet picture bitprophet  ·  4Commentaires