Python Selenium 및 geckodriver를 사용하여 연결이 거부되었습니다(OS 오류 111).

Python Selenium 및 geckodriver를 사용하여 연결이 거부되었습니다(OS 오류 111).

저는 웹 스크래핑이 처음입니다. 아래와 같이 Debian Buster와 Firefox Geckodriver에서 Python을 사용하여 개인 애플리케이션을 구축하고 있습니다. 서버는 온라인입니다.

firefox_binary = FirefoxBinary('/usr/bin/firefox')
opts = FirefoxOptions()
opts.add_argument("--headless")
driver = webdriver.Firefox(options=opts, firefox_binary=firefox_binary)
driver.get(url)

내 목표는 웹 페이지에서 ajax 호출을 통해 이 애플리케이션을 트리거하는 것입니다. 이는 nginx 서버이므로 py 스크립트는 php exec 명령에서 호출됩니다.

exec ('/usr/bin/python3 webdriver.py');

루트나 다른 사용자로 로그인하면 데비안의 명령줄에서 제대로 작동합니다. 웹 인터페이스를 사용하여 스크립트를 호출하면 사용자는 www-data이고 다음 오류가 발생합니다.연결이 거부되었습니다(OS 오류 111).

3일 동안 모든 인터넷 리소스를 검색하고 가능한 모든 것을 시도했지만 아직 해결책이 없습니다.

이 문제에 대한 해결책을 알고 있나요?

편집하다:

  • 셀레늄 버전 3.141.0

  • 모질라 파이어폭스 78.8.0esr

  • 게코 드라이버 0.29

  • www-data 사용자에 대한 geckodriver.log(오류 포함):

    • 1614703595351 geckodriver 정보 127.0.0.1:53899에서 듣기
    • 1614703595556 mozrunner::runner INFO 명령 실행: "/usr/bin/firefox" "--marionette" "--headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile22XajP"
    • *** 헤드리스 모드에서 실행 중입니다.
  • 관리자의 geckodriver.log(오류 없음):

    • 1614702846828 geckodriver 정보 127.0.0.1:46897에서 듣기
    • 1614702847019 mozrunner::runner INFO 명령 실행: "/usr/bin/firefox" "--marionette" "--headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile7jTA4y"
    • *** 헤드리스 모드에서 실행 중입니다.
    • 1614702859057 마리오네트 INFO 청취 포트 45145
    • 1614702859109 Marionette WARN TLS 인증서 오류는 이 세션에서 무시됩니다.
    • JavaScript 경고: https://.............js?v=1.2.7199.0, 119행: return 문 이후 코드에 액세스할 수 없습니다.
    • JavaScript 경고: https://.............js?v=1.2.7199.0, 119행: return 문 이후 코드에 액세스할 수 없습니다.
    • 1614702872140 마리오네트 경고 TimedPromise가 500밀리초 후에 시간 초과됨: 스택 추적:
    • TimedPromise/<@chrome://marionette/content/sync.js:245:13
    • TimedPromise@chrome://marionette/content/sync.js:230:10
    • Interaction.flushEventLoop@chrome://marionette/content/interaction.js:416:10 webdriverClickElement@chrome://marionette/content/interaction.js:182:31
    • 1614702900530 Marionette INFO가 포트 45145에서 수신 대기를 중지했습니다.
  • geckodriver.log geckodriver 0.21용 www-데이터:

    • 1614706982655 geckodriver 정보 geckodriver 0.21.0

    • 1614706982680 geckodriver 정보 127.0.0.1:33947에서 듣기

    • 1614706983553 mozrunner::runner INFO 명령 실행: "/usr/bin/firefox" "-marionette" "--headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile.p37a7r0syAmR"

    • *** 헤드리스 모드에서 실행 중입니다.

    • (firefox-esr:22409): dconf-CRITICAL **:17:44:03.845: '/var/www/.cache/dconf' 디렉터리를 생성할 수 없습니다: 권한이 거부되었습니다. dconf가 제대로 작동하지 않습니다.

답변1

이는 권한 문제입니다. www-data의 홈 디렉토리는 /var/www이며 일반적으로 루트가 소유합니다.

/var/www를 www-data에 부여하거나 권한 변경을 제한하려면 /var/www/.mozilla를 만들고 소유권을 www-data로 변경할 수 있습니다. 그런 다음 스크립트를 다시 실행해 보세요.

현재 일어나고 있는 것으로 보이는 것은 Firefox가 사용자 기본 설정을 저장하려고 시도했지만 실패했다는 것입니다. 오류가 보고되지 않았고 기본 프로세스가 완전히 중단되지는 않았지만 여전히 geckodriver와 통신할 수 없을 정도로 제한되었습니다.

원천:https://answers.launchpad.net/ubuntu/+question/695824

답변2

네, 잘 작동합니다. 정말 감사합니다

방금 다음 디렉터리를 만들었습니다: /var/www/.cache /var/www/.mozilla

www-data에 쓰기 권한을 부여합니다.

이것이 보안 문제가 아닌지 궁금합니다. 어쩌면 Mozilla의 작업 디렉토리를 다른 곳에 지정하는 것이 더 나을 수도 있습니다.

답변3

주요 문제는 .cache폴더 이며 .mozilla권한이 필요합니다. 데이터는 스크립트를 실행하는 사용자의 프로필에 생성됩니다.

이 솔루션은 저에게 효과적이었습니다.

  1. 캐시를 저장해야 하는 사용자를 결정합니다. 내가 아는 한 그건 그렇다. www-데이터(사용자심포니 오케스트라). 나는 폴더를 체크인했다 /tmp/. /tmp/Temp-276cddf8-d7c5-4a09...Firefox에서 생성된 것과 같은 폴더의 소유자를 볼 수 있습니다 .

  2. /etc/passwd사용자에게 bash 권한이 필요하므로 다음에서 파일 www-data:33:33:www-data:/usr/sbin:/usr/sbin/nologin크기를 조정 해야 합니다.www-data:x:33:33:www-data:**/var/www**:**/bin/bash**
  3. 제 경우에는 경로에 폴더를 만듭니다 /var/www/(경로는 파일에 지정된 사용자 경로에 있음 /etc/passwd).

mkdir /var/www/.cache

mkdir /var/www/.mozilla

chown www-data:www-data .cache

chown www-data:www-data .mozilla


@sdragnev의 답변은 정확하지만 제 경우에는 여전히 사용자에게 bash 권한을 부여해야 합니다.

관련 정보