Ошибка Paramiko из-за прав доступа к файлам - PullRequest
0 голосов
/ 01 июня 2018

Я пытался автоматизировать передачу SFTP с клиента Windows через скрипт python на компьютер CentOS с сервером Apache.Я создал учетную запись пользователя на сервере CentOS, который может получить доступ только к SFTP, аналогично приведенным ниже инструкциям: https://www.digitalocean.com/community/tutorials/how-to-enable-sftp-without-shell-access-on-centos-7

Затем я использовал следующий код в попытке передать файл

transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(base_dir + '\\report', '/var/www/html/reports/' + host_name, confirm = False)

Однако это приводит к следующей ошибке:

Traceback (most recent call last):
  File "noschedule_make_report.py", line 74, in <module>
    main()
  File "noschedule_make_report.py", line 62, in main
    sftp.chdir('/var/www/html/reports')
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 626, in chdir
    if not stat.S_ISDIR(self.stat(path).st_mode):
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 460, in stat
    t, msg = self._request(CMD_STAT, path)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 861, in _convert_status
    raise IOError(errno.ENOENT, text)
IOError: [Errno 2] No such file

Этот код работал, когда я не установил ограничения на загрузку учетной записи пользователя, как описано в посте Digital Ocean, и вместо этого имел гораздо большелиберальные разрешения и логин оболочки.Могу ли я получить как заблокированный логин для загружаемого пользователя, так и использовать функцию Paramiko?

Обратите внимание, что использование команды sftp.chdir('/var/www/html/reports') перед командой put приводило к той же ошибке, возникающей в строке chdir.

Также я понимаю, что были заданы похожие вопросы ( IOError: [Errno 2] Нет такого файла - Paramiko put () ), но я специально спрашиваю, могу ли я отложить эти два наборафункциональности.

1 Ответ

0 голосов
/ 01 июня 2018

Существует концепция, которую вы, возможно, не заметили при настройке части sftp. Это ChrootDirectory.

A Chroot в мире Unix - это способ выполнить команду или среду в системном каталоге, поэтому этот каталог является корнем системы, в которую вы работаете.Это в основном используется в качестве функции безопасности, потому что нет способа избежать этого chroot.Например, представьте, что у вас есть путь /opt/server/ftp/users/, а демон ftp chroot ed в /opt/server/ftp/, клиент увидит каталог users, когда он сделает ls -al, и будет невозможно получить доступ к файлам насистема, подобная /etc/

Так что эта проблема не имеет ничего общего с самим кодом Paramiko, но с установленной вами конфигурацией sftp и пониманием среды Chroot.

ChrootDirectory в вашей настройке определите, что пользователь sftp будет удален в этот каталог при создании соединения И что он не сможет увидеть полный путь системы, когда он зарегистрирован, поэтому при загрузке файлов вам не нужноchdir /var/www/html/reports потому что вы не можете видеть этот каталог.Учитывая, что вы установили ChrootDirectory /var/www/html/reports

Сначала проверьте установленное вами значение ChrootDirectory, если вы поставили /var/sftp/, но вы хотите получить доступ к системному пути (не к chroot) /var/www/html/reports/, это неправильно.Правильное значение /var/www/html/reports/ кажется правильным, затем измените код на

sftp.put(base_dir + '\\report', '.' + host_name, confirm = False)

на символ ., так как второй параметр означает текущий каталог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...