Fabric: Tidak dapat `context.put` file dengan `sudo`.

Dibuat pada 14 Mei 2018  ·  3Komentar  ·  Sumber: fabric/fabric

Di v2, parameter use_sudo=True tidak ada lagi.
Jika saya mencoba menyalin file di Host jarak jauh, inilah yang saya dapatkan:

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

Komentar yang paling membantu

@geoffrey-eisenbarth Saat ini tidak ada pendekatan "diberkati" untuk ini - lihat sedikit tentang Sudo di bawah http://www.fabfile.org/upgrading.html#file -transfer

Untuk saat ini, Anda ingin melakukan sesuatu yang mendasar seperti

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

Semua 3 komentar

Ini didokumentasikan di http://docs.fabfile.org/en/latest/upgrading.html#id15. Tampaknya tidak ada pengganti perintah tunggal yang bagus untuk ini – misalnya Anda tidak dapat menggunakan c.sudo("install … /dev/stdin /path/to/remote") – dan tampaknya ada bug di sudo() yang mencegah penggunaan tee (tidak pernah berakhir dan hanya membiarkan perintah menggantung menunggu input).

Inilah yang saya gunakan untuk melakukan tarian file-temp, yang bisa dibilang apa yang harus selalu Anda lakukan untuk menghindari meninggalkan file dengan izin yang tidak diinginkan:

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

Dipanggil sebagai misalnya

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

Apakah ini rute yang diharapkan untuk digunakan ketika mencoba menyalin file lokal ke server jauh di luar direktori home pengguna?

Apa cara yang dimaksudkan untuk menggunakan Fabric dan menyalin file ke, katakanlah, /etc/nginx/? Saya mencoba menemukan cara fabric2 menggunakan upload_template dll.

@geoffrey-eisenbarth Saat ini tidak ada pendekatan "diberkati" untuk ini - lihat sedikit tentang Sudo di bawah http://www.fabfile.org/upgrading.html#file -transfer

Untuk saat ini, Anda ingin melakukan sesuatu yang mendasar seperti

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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jmcgrath207 picture jmcgrath207  ·  5Komentar

26huitailang picture 26huitailang  ·  3Komentar

bitprophet picture bitprophet  ·  4Komentar

peteruhnak picture peteruhnak  ·  6Komentar

Grazfather picture Grazfather  ·  4Komentar