ultrafunkamsterdam / undetected-chromedriver

Custom Selenium Chromedriver | Zero-Config | Passes ALL bot mitigation systems (like Distil / Imperva/ Datadadome / CloudFlare IUAM)
https://github.com/UltrafunkAmsterdam/undetected-chromedriver
GNU General Public License v3.0
9.57k stars 1.14k forks source link

【solved】How to do can solve Fatal server error: (EE) Server is already active for display 1 #1985

Open mouyong opened 1 month ago

mouyong commented 1 month ago

Fatal server error: (EE) Server is already active for display 1 If this server is no longer running, remove /tmp/.X1-lock and start again. (EE)

image
mouyong commented 1 month ago

this is my docker-compose.yml and Dockerfile

image image
mouyong commented 1 month ago

add argument --disable-dev-shm-usage can solve need shm_size: 2g problem

image
mouyong commented 1 month ago

https://blog.csdn.net/qq_39101111/article/details/78726927

ps aux | grep `cat /tmp/.X1-lock`
image
mouyong commented 1 month ago

when i run command: rm /tmp/.X1-lock

will be see

(EE) Cannot establish any listening sockets - Make sure an X server isn't already running(EE) 
_XSERVTransSocketUNIXCreateListener: ...SocketCreateListener() failed
_XSERVTransMakeAllCOTSServerListeners: server already running
(EE) 
mouyong commented 1 month ago

xvfb-run Xvfb

when i search in google, found those tow command. but doesn't known how to use it.

mouyong commented 1 month ago

when see dockerfile: https://hub.docker.com/layers/ultrafunk/undetected-chromedriver/latest/images/sha256-d867b57e7bd5a8de0b3d1e58a7d3f1775cb81fbe556d701d9568aca2c16718cb?context=explore

i found this config xrdp.ini in /etc/xrdp/xrdp.ini

[Globals]
; xrdp.ini file version number
ini_version=1

; fork a new process for each incoming connection
fork=true

; ports to listen on, number alone means listen on all interfaces
; 0.0.0.0 or :: if ipv6 is configured
; space between multiple occurrences
;
; Examples:
;   port=3389
;   port=unix://./tmp/xrdp.socket
;   port=tcp://.:3389                           127.0.0.1:3389
;   port=tcp://:3389                            *:3389
;   port=tcp://<any ipv4 format addr>:3389      192.168.1.1:3389
;   port=tcp6://.:3389                          ::1:3389
;   port=tcp6://:3389                           *:3389
;   port=tcp6://{<any ipv6 format addr>}:3389   {FC00:0:0:0:0:0:0:1}:3389
;   port=vsock://<cid>:<port>
port=3389

; 'port' above should be connected to with vsock instead of tcp
; use this only with number alone in port above
; prefer use vsock://<cid>:<port> above
use_vsock=false

; regulate if the listening socket use socket option tcp_nodelay
; no buffering will be performed in the TCP stack
tcp_nodelay=true

; regulate if the listening socket use socket option keepalive
; if the network connection disappear without close messages the connection will be closed
tcp_keepalive=true

; set tcp send/recv buffer (for experts)
#tcp_send_buffer_bytes=32768
#tcp_recv_buffer_bytes=32768

; security layer can be 'tls', 'rdp' or 'negotiate'
; for client compatible layer
security_layer=negotiate

; minimum security level allowed for client for classic RDP encryption
; use tls_ciphers to configure TLS encryption
; can be 'none', 'low', 'medium', 'high', 'fips'
crypt_level=high

; X.509 certificate and private key
; openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365
; note this needs the user xrdp to be a member of the ssl-cert group, do with e.g.
;$ sudo adduser xrdp ssl-cert
certificate=
key_file=

; set SSL protocols
; can be comma separated list of 'SSLv3', 'TLSv1', 'TLSv1.1', 'TLSv1.2', 'TLSv1.3'
ssl_protocols=TLSv1.2, TLSv1.3
; set TLS cipher suites
#tls_ciphers=HIGH

; Section name to use for automatic login if the client sends username
; and password. If empty, the domain name sent by the client is used.
; If empty and no domain name is given, the first suitable section in
; this file will be used.
autorun=

allow_channels=true
allow_multimon=true
bitmap_cache=true
bitmap_compression=true
bulk_compression=true
#hidelogwindow=true
max_bpp=32
new_cursors=true
; fastpath - can be 'input', 'output', 'both', 'none'
use_fastpath=both
; when true, userid/password *must* be passed on cmd line
#require_credentials=true
; You can set the PAM error text in a gateway setup (MAX 256 chars)
#pamerrortxt=change your password according to policy at http://url

;
; colors used by windows in RGB format
;
blue=009cb5
grey=dedede
#black=000000
#dark_grey=808080
#blue=08246b
#dark_blue=08246b
#white=ffffff
#red=ff0000
#green=00ff00
#background=626c72

;
; configure login screen
;

; Login Screen Window Title
#ls_title=My Login Title

; top level window background color in RGB format
ls_top_window_bg_color=009cb5

; width and height of login screen
ls_width=350
ls_height=430

; login screen background color in RGB format
ls_bg_color=dedede

; optional background image filename (bmp format).
#ls_background_image=

; logo
; full path to bmp-file or file in shared folder
ls_logo_filename=
ls_logo_x_pos=55
ls_logo_y_pos=50

; for positioning labels such as username, password etc
ls_label_x_pos=30
ls_label_width=65

; for positioning text and combo boxes next to above labels
ls_input_x_pos=110
ls_input_width=210

; y pos for first label and combo box
ls_input_y_pos=220

; OK button
ls_btn_ok_x_pos=142
ls_btn_ok_y_pos=370
ls_btn_ok_width=85
ls_btn_ok_height=30

; Cancel button
ls_btn_cancel_x_pos=237
ls_btn_cancel_y_pos=370
ls_btn_cancel_width=85
ls_btn_cancel_height=30

[Logging]
LogFile=xrdp.log
LogLevel=DEBUG
EnableSyslog=true
SyslogLevel=DEBUG
; LogLevel and SysLogLevel could by any of: core, error, warning, info or debug

[Channels]
; Channel names not listed here will be blocked by XRDP.
; You can block any channel by setting its value to false.
; IMPORTANT! All channels are not supported in all use
; cases even if you set all values to true.
; You can override these settings on each session type
; These settings are only used if allow_channels=true
rdpdr=true
rdpsnd=true
drdynvc=true
cliprdr=true
rail=true
xrdpvr=true
tcutils=true

; for debugging xrdp, in section xrdp1, change port=-1 to this:
#port=/tmp/.xrdp/xrdp_display_10

; for debugging xrdp, add following line to section xrdp1
#chansrvport=/tmp/.xrdp/xrdp_chansrv_socket_7210

;
; Session types
;

; Some session types such as Xorg, X11rdp and Xvnc start a display server.
; Startup command-line parameters for the display server are configured
; in sesman.ini. See and configure also sesman.ini.
#[Xorg]
#name=Xorg
#lib=libxup.so
#username=ask
#password=ask
#ip=127.0.0.1
#port=-1
#code=20

[Xvnc]
name=Xvnc
lib=libvnc.so
#username=ask
#password=ask
ip=127.0.0.1
port=5900
#xserverbpp=24
#delay_ms=2000

#[vnc-any]
#name=vnc-any
#lib=libvnc.so
#ip=ask
#port=ask5900
#username=na
#password=ask
#pamusername=asksame
#pampassword=asksame
#pamsessionmng=127.0.0.1
#delay_ms=2000

#[neutrinordp-any]
#name=neutrinordp-any
#lib=libxrdpneutrinordp.so
#ip=ask
#port=ask3389
#username=ask
#password=ask

; You can override the common channel settings for each session type
#channel.rdpdr=true
#channel.rdpsnd=true
#channel.drdynvc=true
channel.cliprdr=true
#channel.rail=true
#channel.xrdpvr=true
mouyong commented 1 month ago

and found demo.py

/demo.py

#!/usr/bin/python3
import logging
import subprocess
import time
import undetected_chromedriver as uc

logging.basicConfig(level=10)
logging.getLogger("parso").setLevel(100) # i hate damn parso

#o = uc.ChromeOptions()
#o.arguments.extend(["--no-sandbox", "--disable-setuid-sandbox"])  # these are needed to run chrome as root
driver = uc.Chrome(advanced_elements=True)
driver.get("https://nowsecure.nl/#relax")

logging.getLogger().info('sleeping 5 seconds to give site a chance to load')
time.sleep(5) # this is only for the timing of the screenshot
logging.getLogger().setLevel(20)
driver.save_screenshot("/data/nowsecure.png")
subprocess.run(["catimg", "/data/nowsecure.png"])
logging.getLogger().info('screenshot saved to /data/nowsecure.png')
input("press a key to quit")
exit()

/entrypoint.sh

#!/bin/bash

trap "cleanup" 1 2 3 6 9 14 15

cleanup()
{
    echo "cleaning up" >> /tmp/out.log
    sleep 1;
    for pid in $(find /proc -maxdepth 1 -type d -printf "%P\n"); do
        if [[ ! $pid =~ '[0-9]*' ]]; then continue; fi

        if [ "$pid" != "$$" ] && [ "$pid" != "1" ]; then
            kill -15 $pid
        fi
    done;
    exit 0
}

checkChrome()
{
    local chrome_ok=false

    if [ $(command -v google-chrome) ]; then
        chrome_ok=true
        version=$(google-chrome --version);
        read -t 5 -p "[CHROME] version is $version. do you want to check for update? (timeout 5 seconds) [y/n]: " update
        if [ "$update" =~ "[yY]" ]; then
            chrome_ok=false
        fi

    else
        echo "[CHROME] this seems like your first run. Chrome needs to be installed ....  "; sleep 3
    fi
    if ! $chrome_ok; then
        DEBIAN_FRONTEND=noninteractive && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub > /usr/share/keyrings/chrome.pub \
            && echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/chrome.pub] http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/google-chrome.list \
            && apt update -y && apt install -y google-chrome-stable
    fi

}

check_or_install()
{
    local name="$1"

    if [ ! $(command -v $name) ]; then
        echo "[X] no $name found on the system. we'll install it now..";
        sleep 1
        DEBIAN_FRONTEND=noninteractive apt install -y $name
    fi
    command -v $name > /dev/null
    return $?
}

sourced=false
if [ -n "$ZSH_VERSION" ]; then
    case $ZSH_EVAL_CONTEXT in *:file) sourced=true ;; esac
elif [ -n "$BASH_VERSION" ]; then
    (return 0 2> /dev/null) && sourced=true
else
    # All other shells: examine $0 for known shell binary filenames.
    # Detects `sh` and `dash`; add additional shell filenames as needed.
    case ${0##*/} in sh | -sh | dash | -dash) sourced=true ;; esac
fi

function keepUpScreen()
{
    echo "running keepUpScreen()"
    while true; do
        sleep 1
        if [ -z "$(pidof Xvfb)" ]; then
            Xvfb $DISPLAY -screen $DISPLAY 1280x1024x16 &
        fi
    done
}

startDesktop()
{
    check_or_install x11vnc || return 1
    check_or_install Xvfb || return 1
    check_or_install xvfb-run || return 1
    check_or_install fluxbox || return 1

    x11vnc -create -env FD_PROG=/usr/bin/fluxbox \
        -env X11VNC_FINDDISPLAY_ALWAYS_FAILS=1 \
        -env X11VNC_CREATE_GEOM=${1:-1280x1024x16} \
        -gone 'killall Xvfb' \
        -forever \
        -nopw \
        -quiet &

    localip="$(hostname -I)"
    remoteip=$(curl -s "https://httpbin.org/ip" \
        | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")

    echo "----------------------------------------------------------"
    echo "to conect to your desktop using vnc:"
    echo "depending on your setup"
    echo ""
    echo "${localip}:5900   (local)"
    echo "or"
    echo "${remoteip}:5900  (remote)"
    echo "----------------------------------------------------------"
    echo "in both cases, the container should have exposed port 5900"
    echo "like 'docker run ...  -P 5900:5900 .... '"
    echo "----------------------------------------------------------"
    xrdp & 
}

if ! $sourced; then
    export DISPLAY=:1
    rm -f /tmp/.X1-lock &>/dev/null
#    checkChrome
    keepUpScreen &
    echo "running: $@"
    exec $@
fi
image
mouyong commented 1 month ago

this problem is solved, RUN sed -i 's/pidof Xvfb/pgrep -f Xvfb/g' /entrypoint.sh

image image
mouyong commented 1 month ago

72261723468710_ pic

72291723468748_ pic

72301723468767_ pic