Freerdp
FreeRDP | |
---|---|
Разработчик(и) | FreeRDP Team |
Первый выпуск | 2009 |
Лицензия | Apache 2.0 |
Репозиторий | freerdp freerdp3 |
Сайт | freerdp.com |
Сервер
FreeRDP - свободная реализация протокола удаленного рабочего стола (RDP), выпущенная под лицензией Apache. Является форком rdesktop.
Функции
Удаленный доступ к рабочему столу
- Удалённый доступ к рабочему столу: позволяет подключаться к удалённым сессиям по протоколу RDP.
- Шифрование соединения: поддержка различных уровней безопасности, включая TLS и NLA (Network Level Authentication).
- Поддержка нескольких пользователей: одновременная работа нескольких удалённых сессий.
- Мультиплатформенность: работает на Linux, Windows, macOS, Android и других системах.
Доступ к удаленным ресурсам
- Передача аудио и видео: поддержка передачи мультимедийного контента с удалённого устройства.
- Поддержка USB и других устройств: проброс устройств (например, принтеров, смарт-карт) с клиента на сервер.
Установка
В ALT Linux есть две версии версии сервера FreeRDP:
- freerdp-server - сервер v2
- freerdp3-server - сервер v3
Но лучше ставить 3-ю версию.
Выберите нужную и установите командой:
# apt-get install freerdp3-server
Техническая часть
Согласно https://miloserdov.org/?p=4508:
# apt-get install xfreerdp3
- Для графического подключения используется бинарник freerdp-shadow-cli. Он из пакета freerdp3-server.
# apt-get install freerdp3-server
Разрешить доступ всем (PAM и X11)
Запускаем бинарник как службу:
$ freerdp-shadow-cli -auth
Если включена аутентификация параметром -auth, используется PAM с подсистемой X11. Запуск от имени root не требуется, однако, если сервер запущен от имени пользователя, аутентификацию может пройти только тот пользователь, который запустил freerdp-shadow.
Разрешить вход ограниченным пользователям
Любая сетевая служба без аутентификации — это катастрофа для безопасности системы. Поэтому рассмотрим, как запустить freerdp-shadow с поддержкой NLA.
В первую очередь для NLA необходимо создать файл, в котором будет строка вида:
USER:::HASH:::
Мы знаем имя пользователя Linux, для вычисления хеша нам нужно выполнить команду вида:
$ winpr-hash -u USER -p PASSWORD
Например, имя пользователя mial , а пароль 2 , тогда команда будет следующей:
$ winpr-hash -u mial -p 2
Рассчитанный хэш: 8f33e2ebe5960b8738d98a80363786b0
Создайте текстовый файл SAM и запишите в него строку
mial:::8f33e2ebe5960b8738d98a80363786b0:::
Теперь запустите freerdp-shadow-cli с двумя опциями:
/sam-file:FILE – указывает местоположение файла NTLM SAM для аутентификации NLA /sec:nla - принудительная аутентификация NLA
Итак, команда такая:
$ freerdp-shadow-cli /sam-file:SAM /sec:nla
Чтобы заработало подключение из Windows (Win7/8.1/10)
Mtsc из Windows подключается к FreeRDP при параметре freerdp-shadow-cli -auth
Управление сервисом (службой)
При установке конфигурационный файл службы располагается в /usr/lib/systemd/user/freerdp-server.service.
$ rpm -ql freerdp3-server |grep .service /usr/lib/systemd/user/freerdp-server.service
Файл службы выглядит так:
[Unit] Description=Remote access to desktop via RDP PartOf=graphical-session.target [Service] EnvironmentFile=-/etc/sysconfig/freerdp-server ExecStart=/usr/bin/freerdp-shadow-cli $FREERDP_SERVER_ARGS [Install] WantedBy=graphical-session.target
Переменные окружения указанные в файле - EnvironmentFile=-/etc/sysconfig/freerdp-server - содержат следующую информацию:
# Block monitors and input devices upon connection #FREERDP_SERVER_ARGS="/on-connect:/etc/freerdp/freerdp-login.sh /on-disconnect:/etc/freerdp/freerdp-logout.sh" FREERDP_SERVER_ARGS=""
Если закомментировать вторую строчку и раскомментировать первую, то сервер будет работать наподобие удаленного рабочего стола в Windows (не терминального сервиса) - при подключении через удаленный рабочий стол сессия будет блокироваться.
Включение автозапуска службы:
$ systemctl enable freerdp-server --user
Запуск службы:
$ systemctl start freerdp-server --user
Остановка службы:
$ systemctl stop freerdp-server --user
Статус службы:
$ systemctl status freerdp-server --user
Клиент
Основные возможности FreeRDP (xfreerdp):
- Поддержка современных версий RDP
- Совместимость с RDP 7.1 и выше (вплоть до RDP 10.x).
- Полная поддержка NLA (Network Level Authentication), необходимого для новых версий Windows Server и Windows 10/11.
- Многофункциональность
- Передача звука: звук с удалённого рабочего стола воспроизводится на клиенте.
- Перенаправление устройств: проброс USB-устройств, дисков, смарт-карт, принтеров.
- Поддержка RemoteApp: запуск отдельных приложений Windows, без необходимости отображать весь рабочий стол.
- Работа с несколькими мониторами: можно использовать несколько дисплеев при удалённом подключении.
- Аппаратное ускорение: поддержка OpenGL, DirectX для оптимизации графики.
- Безопасность
- Шифрование TLS.
- Поддержка CredSSP (Credential Security Support Provider).
- NLA для безопасного обмена учётными данными.
- Поддержка стандартов и расширений
- Умеет работать с FreeRDP Gateway (RD Gateway).
- Поддержка RDP Dynamic Virtual Channels.
- Кроссплатформенность
- Работает на Linux, Windows, macOS, Android и других системах.
Установка
В ALT Linux есть четыре версии клиента FreeRDP:
- xfreerdp - клиент для X.org v2
- wlfreerdp - клиент для Wayland v2
- xfreerdp3 - клиент для X.org v3
- wlfreerdp3 - клиент для Wayland v3
Выберите нужную и установите командой:
# apt-get install xfreerdp3
Использование
xfreerdp [file] [options] [/v:<server>[:port]]
Синтаксис:
/flag (включить флаг) /option:<value> (указать параметр со значением) +toggle -toggle (включить или выключить переключатель, где '/' синоним '+')
Заголовок | ||
---|---|---|
Параметр | Описание | |
Включить возможность | ||
Производительность | ||
-fonts | Отключить сглаживание шрифтов (ClearType) | |
-wallpaper | Отключить обои рабочего стола | |
-themes | Отключить темы | |
+aero | Включить композицию рабочего стола | |
-decorations | Отключить оформление окон | |
Безопасность | ||
+auth-only | Разрешить доступ только по аутентификации | |
-authentication | Отключить аутентификацию (экспериментально) | |
+enforce-tlsv1_2 | Включить принудительное использование TLS1.2 для подключения. Некоторые серверы имеют ошибочное согласование версии TLS и могут не дать подключиться без этого параметра | |
+password-is-pin | Включить использование аутентификации смарт-карты с паролем в качестве PIN-кода смарт-карты | |
Разное | +auto-reconnect | Включить автоматическое переподключение |
-toggle-fullscreen | Отключить Alt+Ctrl+Enter для переключения на весь экран | |
+home-drive | Включить перенаправление домашней папки пользователя в качестве сетевого ресурса на удаленный стол | |
-grab-keyboard | Отключить захват клавиатуры | |
-grab-mouse | Отключить захват мыши | |
+clipboard | Буфер обмена | |
Параметры возможностей | ||
Экран | /f | Полноэкранный режим (<Ctrl>+<Alt>+<Enter> так же переключает в полноэкранный режим) |
/w:знач /h:знач | Разрешение экрана - длина/ширина. Используются вместе или в одиночку | |
/size:WxH | Разрешение экрана - длина/ширина. | |
Безопасность | /cert:[deny,ignore,name:<name>,tofu,fingerprint:<hash>:<hash as hex> |
Параметры принятия сертификата. Используйте с осторожностью!
|
Удаленное приложение | /app:<path> или ||<alias> | Запуск удаленного приложения |
/app-cmd:<parameters> | Параметры командной строки для удаленного приложения | |
/app-file:<file-name> | Файл для открытия удаленным приложением | |
/app-cmd:<parameters> | Параметры командной строки удаленного приложения | |
/app-file:<имя-файла> | Файл для открытия с помощью удаленного приложения | |
/app-icon:<icon-path> | Значок удаленного приложения для пользовательского интерфейса | |
/app-name:<app-name> | Имя удаленного приложения для пользовательского интерфейса | |
/app-workdir:<workspace path> | Путь к рабочему пространству удаленного приложения | |
Автоматическое переподключение | /auto-reconnect-max-retries:<повторения> | Максимальное количество попыток автоматического переподключения: 0 для неограниченного [0,1000] |
Пользователь | /d:<домен> | Домен |
/p:<password> | Пароль | |
/u:[[<domain>\]<user>|<user>[@<domain>]] | Пользователь | |
Сервер | /v:<server>[:port] | Сервер |
/port:<number> | Порт сервера | |
Оборудование | /printer[:<name>[,<driver>]] | Перенаправление принтера |
/smartcard[:<str>[,<str>...]] | Перенаправление смарткарт | |
/usb:[dbg,][id:<vid>:<pid>#...,][addr:<bus>:<addr>#...,][auto] | Перенаправление USB | |
/drive:<name>,<path> | Перенаправить каталог <path> как общий ресурс с именем <name>. | |
/sound | Перенаправить звук |
Подробный Man:
Syntax: /flag (enables flag) /option:<value> (specifies option with value) +toggle -toggle (enables or disables toggle, where '/' is a synonym of '+') /a:<addin>[,<options>] Addin /action-script:<file-name> Action script /admin Admin (or console) session +aero Enable desktop composition /app:<path> or ||<alias> Remote application program /app-cmd:<parameters> Remote application command-line parameters /app-file:<file-name> File to open with remote application /app-guid:<app-guid> Remote application GUID /app-icon:<icon-path> Remote application icon for user interface /app-name:<app-name> Remote application name for user interface /app-workdir:<workspace path> Remote application workspace path /assistance:<password> Remote assistance password /auto-request-control Automatically request remote assistance input control +async-channels Enable Asynchronous channels (experimental) +async-input Enable Asynchronous input +async-update Enable Asynchronous update /audio-mode:<mode> Audio output mode +auth-only Enable Authenticate only -authentication Disable Authentication (experimental) +auto-reconnect Enable Automatic reconnection /auto-reconnect-max-retries:<retries> Automatic reconnection maximum retries, 0 for unlimited [0,1000] +bitmap-cache Enable bitmap cache /bpp:<depth> Session bpp (color depth) /buildconfig Print the build configuration /cert:[deny,ignore,name:<name>,tofu,fingerprint:<hash>:<hash as hex> [,fingerprint:<hash>:<another hash>]] Certificate accept options. Use with care! * deny ... Automatically abort connection if the certificate does not match, no user interaction. * ignore ... Ignore the certificate checks altogether (overrules all other options) * name ... Use the alternate <name> instead of the certificate subject to match locally stored certificates * tofu ... Accept certificate unconditionally on first connect and deny on subsequent connections if the certificate does not match * fingerprints ... A list of certificate hashes that are accepted unconditionally for a connection /cert-deny [deprecated, use /cert:deny] Automatically abort connection for any certificate that can not be validated. /cert-ignore [deprecated, use /cert:ignore] Ignore certificate /cert-name:<name> [deprecated, use /cert:name:<name>] Certificate name /cert-tofu [deprecated, use /cert:tofu] Automatically accept certificate on first connect /client-build-number:<number> Client Build Number sent to server (influences smartcard behaviour, see [MS-RDPESC]) /client-hostname:<name> Client Hostname to send to server -clipboard[:[use-selection:<atom>]] Disable Redirect clipboard. * use-selection:<atom> ... (X11) Specify which X selection to access. Default is CLIPBOARD. PRIMARY is the X-style middle-click selection. /codec-cache:[rfx|nsc|jpeg] Bitmap codec cache -compression Disable compression /compression-level:<level> Compression level (0,1,2) +credentials-delegation Enable credentials delegation /d:<domain> Domain -decorations Disable Window decorations /disp Display control /drive:<name>,<path> Redirect directory <path> as named share <name>. Hotplug support is enabled with /drive:hotplug,*. This argument provides the same function as "Drives that I plug in later" option in MSTSC. +drives Enable Redirect all mount points as shares /dvc:<channel>[,<options>] Dynamic virtual channel /dynamic-resolution Send resolution updates when the window is resized /echo Echo channel -encryption Disable Encryption (experimental) /encryption-methods:[40,][56,][128,][FIPS] RDP standard security encryption methods /f Fullscreen mode (<Ctrl>+<Alt>+<Enter> toggles fullscreen) -fast-path Disable fast-path input/output +fipsmode Enable FIPS mode /floatbar[:sticky:[on|off],default:[visible|hidden],show: [always|fullscreen||window]] floatbar is disabled by default (when enabled defaults to sticky in fullscreen mode) -fonts Disable smooth fonts (ClearType) /frame-ack:<number> Number of frame acknowledgement /from-stdin[:force] Read credentials from stdin. With <force> the prompt is done before connection, otherwise on server request. /g:<gateway>[:<port>] Gateway Hostname /gateway-usage-method:[direct|detect] Gateway usage method /gd:<domain> Gateway domain /gdi:sw|hw GDI rendering /geometry Geometry tracking channel +gestures Enable Consume multitouch input locally /gfx[:[[RFX|AVC420|AVC444],mask:<value>]] RDP8 graphics pipeline /gfx-h264[:[[AVC420|AVC444],mask:<value>] [DEPRECATED] use /gfx:avc420 instead] RDP8.1 graphics pipeline using H264 codec +gfx-progressive Enable RDP8 graphics pipeline using progressive codec +gfx-small-cache Enable RDP8 graphics pipeline using small cache mode +gfx-thin-client Enable RDP8 graphics pipeline using thin client mode +glyph-cache Enable Glyph cache (experimental) /gp:<password> Gateway password -grab-keyboard Disable Grab keyboard -grab-mouse Disable Grab mouse /gt:[rpc|http[,no-websockets]|auto[,no-websockets]] Gateway transport type /gu:[[<domain>\]<user>|<user>[@<domain>]] Gateway username /gat:<access token> Gateway Access Token /h:<height> Height -heartbeat Disable Support heartbeat PDUs /help Print help +home-drive Enable Redirect user home as share /ipv6 Prefer IPv6 AAA record over IPv4 A record /jpeg JPEG codec support /jpeg-quality:<percentage> JPEG quality /kbd:0x<id> or <name> Keyboard layout /kbd-lang:0x<id> Keyboard active language identifier /kbd-fn-key:<value> Function key value /kbd-list List keyboard layouts /kbd-lang-list List keyboard languages /kbd-remap:List of <key>=<value>,... pairs to remap scancodes Keyboard scancode remapping /kbd-subtype:<id> Keyboard subtype /kbd-type:<id> Keyboard type /load-balance-info:<info-string> Load balance info /log-filters:<tag>:<level>[,<tag>:<level>[,...]] Set logger filters, see wLog(7) for details /log-level:[OFF|FATAL|ERROR|WARN|INFO|DEBUG|TRACE] Set the default log level, see wLog(7) for details /max-fast-path-size:<size> Specify maximum fast-path update size /max-loop-time:<time> Specify maximum time in milliseconds spend treating packets +menu-anims Enable menu animations /microphone[:[sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,] [channel:<channel>]] Audio input (microphone) /monitor-list List detected monitors /monitors:<id>[,<id>[,...]] Select monitors to use -mouse-motion Disable Send mouse motion /multimon[:force] Use multiple monitors +multitouch Enable Redirect multitouch input +multitransport Enable Support multitransport protocol -nego Disable protocol security negotiation /network:[modem|broadband|broadband-low|broadband-high|wan|lan|auto] Network connection type /nsc NSCodec support +offscreen-cache Enable offscreen bitmap cache /orientation:[0|90|180|270] Orientation of display in degrees +old-license Enable Use the old license workflow (no CAL and hwId set to 0) /p:<password> Password /parallel[:<name>[,<path>]] Redirect parallel device /parent-window:<window-id> Parent window id +password-is-pin Enable Use smart card authentication with password as smart card PIN /pcb:<blob> Preconnection Blob /pcid:<id> Preconnection Id /pheight:<height> Physical height of display (in millimeters) /play-rfx:<pcap-file> Replay rfx pcap file /port:<number> Server port -suppress-output Disable suppress output when minimized +print-reconnect-cookie Enable Print base64 reconnect cookie after connecting /printer[:<name>[,<driver>]] Redirect printer device /proxy:[<proto>://][<user>:<password>@]<host>:<port> Proxy settings: override env. var (see also environment variable below). Protocol "socks5" should be given explicitly where "http" is default. /pth:<password-hash> Pass the hash (restricted admin mode) /pwidth:<width> Physical width of display (in millimeters) /rdp2tcp:<executable path[:arg...]> TCP redirection /reconnect-cookie:<base64-cookie> Pass base64 reconnect cookie to the connection /redirect-prefer:<FQDN|IP|NETBIOS>,[...] Override the preferred redirection order /relax-order-checks Do not check if a RDP order was announced during capability exchange, only use when connecting to a buggy server /restricted-admin Restricted admin mode /rfx RemoteFX /rfx-mode:[image|video] RemoteFX mode /scale:[100|140|180] Scaling factor of the display /scale-desktop:<percentage> Scaling factor for desktop applications (value between 100 and 500) /scale-device:100|140|180 Scaling factor for app store applications /sec:[rdp|tls|nla|ext] Force specific protocol security +sec-ext Enable NLA extended protocol security -sec-nla Disable NLA protocol security -sec-rdp Disable RDP protocol security -sec-tls Disable TLS protocol security /serial[:<name>[,<path>[,<driver>[,permissive]]]] Redirect serial device /shell:<shell> Alternate shell /shell-dir:<dir> Shell working directory /size:<width>x<height> or <percent>%[wh] Screen size /smart-sizing[:<width>x<height>] Scale remote desktop to window size /smartcard[:<str>[,<str>...]] Redirect the smartcard devices containing any of the <str> in their names. /smartcard-logon Activates Smartcard Logon authentication. (EXPERIMENTAL: NLA not supported) /sound[:[sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,] [channel:<channel>,][latency:<latency>,][quality:<quality>]] Audio output (sound) /span Span screen over multiple monitors /spn-class:<service-class> SPN authentication service class /ssh-agent SSH Agent forwarding channel /t:<title> Window title -themes Disable themes /timeout:<time in ms> Advanced setting for high latency links: Adjust connection timeout, use if you encounter timeout failures with your connection /tls-ciphers:[netmon|ma|ciphers] Allowed TLS ciphers /tls-seclevel:<level> TLS security level - defaults to 1 +enforce-tlsv1_2 Enable Force use of TLS1.2 for connection. Some servers have a buggy TLS version negotiation and might fail without this -toggle-fullscreen Disable Alt+Ctrl+Enter to toggle fullscreen /tune:<setting:value>,<setting:value> [experimental] directly manipulate freerdp settings, use with extreme caution! /tune-list Print options allowed for /tune /u:[[<domain>\]<user>|<user>[@<domain>]] Username +unmap-buttons Enable Let server see real physical pointer button /usb:[dbg,][id:<vid>:<pid>#...,][addr:<bus>:<addr>#...,][auto] Redirect USB device /v:<server>[:port] Server hostname /vc:<channel>[,<options>] Static virtual channel /version Print version /video Video optimized remoting channel /vmconnect[:<vmid>] Hyper-V console (use port 2179, disable negotiation) /w:<width> Width -wallpaper Disable wallpaper +window-drag Enable full window drag /window-position:<xpos>x<ypos> window position /wm-class:<class-name> Set the WM_CLASS hint for the window instance /workarea Use available work area
Примеры
Простое подключение:
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /sec:tls
Файл с параметрами подключения на весь экран:
$ xfreerdp /v:192.168.1.100:4489 /u:JohnDoe /p:Pwd123! /f
Доменный пользователь к серверу с доменным именем:
$ xfreerdp /u:CONTOSO\JohnDoe /p:Pwd123! /v:rdp.contoso.com $ xfreerdp /u:JohnDoe /p:Pwd123! /d:rdp.contoso.com /v:rdp.contoso.com
Подключение к серверу с указанием разрешения экрана:
$ xfreerdp /u:JohnDoe /p:Pwd123! /w:1366 /h:768 /v:192.168.1.100:4489 $ xfreerdp /u:JohnDoe /p:Pwd123! /size:1920x1080 /v:192.168.1.100:4489
Подключение без проверки сертификата (нужен, если у сервера самоподписанный сертификат):
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /cert:ignore
Перенаправление папки:
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /drive:MyLocalFolder,/home/user/shared
Перенаправление звука:
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /sound
Перенаправление USB-устройства:
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /usb:id,dev:VID:PID
- Где VID и PID — идентификаторы устройства (можно посмотреть через lsusb).
Подключение с шифрованием NLA (Network Level Authentication)
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /sec:nla
- Если сервер требует обязательного использования NLA.
- Другие варианты /sec:rdp, /sec:tls, /sec:neg (автоматический выбор).
Подключение к удаленному сеансу
$ xfreerdp /u:JohnDoe /p:Pwd123! /v:192.168.1.100:4489 /shadow
GUI
MyConnector
См. MyConnector
Remmina
См. Remmina.
GUI на Yad
Вариант 1 (подключение, краткий)
Установите freerdp и yad и создайте и запустите следующий скрипт:
# apt-get install xfreerdp3 yad
#!/bin/bash # XFreeRDP RemoteApp W/ Prompt Script # Version 0.3 # Description: # XFreeRDP Remote App Script utilizing Zentity to populate variables # Written by Jarrett Higgins 12-2015 OUTPUT=$(zenity --forms --title="Connection Information" \ --text="Enter information about your Remote Connection" \ --separator="," \ --add-entry="Server" \ --add-entry="Port (Default: 3389)" \ --add-entry="Domain (Optional)" \ --add-entry="Username" \ --add-password="Password" \ --add-entry="Remote App Name (Optional)") OUTPUT_RESULTS=$? if ((OUTPUT_RESULTS != 0)); then echo "something went wrong" exit 1 fi Blank="" Server=$(awk -F, '{print $1}' <<<$OUTPUT) Port=$(awk -F, '{print $2}' <<<$OUTPUT) if ["$Port" = "$Blank"] then Port="3389" else Port="$Port" fi Domain=$(awk -F, '{print $3}' <<<$OUTPUT) Username=$(awk -F, '{print $4}' <<<$OUTPUT) Password=$(awk -F, '{print $5}' <<<$OUTPUT) App=$(awk -F, '{print $6}' <<<$OUTPUT) if ["$App" = "$Blank"] then App="$App" Title="$Server" else AppName="$App" Title="$AppName on $Server" App="/app:||$App" fi #zenity --info --title="Information Return" --text="$Server $Port $Domain $Username $Password $App" xfreerdp /t:"$Title" /v:$Server:$Port /d:$Domain /u:$Username /p:$Password $App /cert:ignore /workarea +clipboard Password=""
Вариант 2 (подключение, подробный)
Установите freerdp и yad и создайте и запустите следующий скрипт:
# apt-get install xfreerdp3 yad
#!/bin/bash CONFIG_FILE="/tmp/rdp_settings.conf" # === 📦 Получаем список доступных принтеров printers=$(lpstat -p 2>/dev/null | awk '{print $2}') printer_list="None" for p in $printers; do printer_list+="!$p" done [ -z "$printers" ] && printer_list="None!Printer1!Printer2" # fallback # === 🔐 Получаем список доступных токенов (простая проверка по dev) tokens=$(ls /dev 2>/dev/null | grep -E 'token|pcsc|smartcard|hid|usb' | sort -u) token_list="None" for t in $tokens; do token_list+="!$t" done [ -z "$tokens" ] && token_list="None!token0!token1" # fallback # === Загружаем предыдущее состояние if [ -f "$CONFIG_FILE" ]; then IFS="|" read -r -a data < "$CONFIG_FILE" else data=("" "" "" "" "" "" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "None" "None" "" "shared" "nla") fi # === Основной цикл while true; do form=$(yad --notebook \ --title="Подключение к RDP (FreeRDP)" \ --width=550 --height=500 \ --center \ --separator="|" \ --form \ --tab="Основное" \ --field="Сервер (обязательно):" "${data[0]}" \ --field="Порт:" "${data[1]}" \ --field="Имя пользователя:" "${data[2]}" \ --field="Пароль (скрыт):H" "${data[3]}" \ --field="Домен (опционально):" "${data[4]}" \ --field="Разрешение экрана:" "${data[5]}" \ --tab="Параметры" \ --form \ --field="Полноэкранный режим:CHK" "${data[6]}" \ --field="Динамическое изменение экрана:CHK" "${data[7]}" \ --field="Отключить проверку сертификата:CHK" "${data[8]}" \ --field="Перенаправлять звук:CHK" "${data[9]}" \ --field="Переподключаться при обрыве:CHK" "${data[10]}" \ --field="Принтер:CB" "${data[11]:-None}!${printer_list#None!}" \ --field="Смарт-карта (токен):CB" "${data[12]:-None}!${token_list#None!}" \ --field="Папка для перенаправления:DIR" "${data[13]}" \ --field="Имя общей папки (в сессии):" "${data[14]}" \ --tab="Безопасность" \ --form \ --field="Тип шифрования:CB" "${data[15]:-nla}!nla!tls!rdp!neg" ) [ $? -ne 0 ] && exit 0 echo "$form" > "$CONFIG_FILE" IFS="|" read server port username password domain resolution \ fullscreen dynres cert_ignore sound autoreconnect \ printer_choice smartcard_choice folder_redirect folder_name encryption <<< "$form" cmd="xfreerdp /v:$server" [ -n "$port" ] && cmd+=":$port" cmd+=" /u:$username /p:$password" [ -n "$domain" ] && cmd+=" /d:$domain" if [ "$fullscreen" = "TRUE" ]; then cmd+=" /f" elif [ -n "$resolution" ]; then width=$(echo "$resolution" | cut -d'x' -f1) height=$(echo "$resolution" | cut -d'x' -f2) cmd+=" /size:${width}x${height}" fi [ "$dynres" = "TRUE" ] && cmd+=" +dynamic-resolution" [ "$cert_ignore" = "TRUE" ] && cmd+=" /cert:ignore" [ "$sound" = "TRUE" ] && cmd+=" /sound" [ "$autoreconnect" = "TRUE" ] && cmd+=" /auto-reconnect" if [ "$printer_choice" != "None" ]; then cmd+=" /printer:$printer_choice" fi if [ "$smartcard_choice" != "None" ]; then cmd+=" /smartcard:$smartcard_choice" fi if [ -n "$folder_redirect" ]; then safe_name="${folder_name:-shared}" cmd+=" /drive:$safe_name,$folder_redirect" fi case "$encryption" in nla) cmd+=" /sec:nla" ;; tls) cmd+=" /sec:tls" ;; rdp) cmd+=" /sec:rdp" ;; neg) cmd+=" /sec:neg" ;; esac yad --question --title="Подтверждение" --text="Выполнить следующую команду?\n\n<b>$cmd</b>" --width=400 [ $? -ne 0 ] && continue eval "$cmd" result=$? if [ $result -eq 0 ]; then rm -f "$CONFIG_FILE" break else yad --error --title="Ошибка подключения" --text="Подключение не удалось (код $result). Повторите попытку." fi done
Вариант 3 (вывод команды)
Установите freerdp и yad и создайте и запустите следующий скрипт:
# apt-get install xfreerdp3 yad
#!/bin/bash # === 📦 Принтеры printers=$(lpstat -p 2>/dev/null | awk '{print $2}') printer_list="None" for p in $printers; do printer_list+="!$p" done [ -z "$printers" ] && printer_list="None!Printer1!Printer2" # === 🔐 Токены tokens=$(ls /dev 2>/dev/null | grep -E 'token|pcsc|smartcard|hid|usb' | sort -u) token_list="None" for t in $tokens; do token_list+="!$t" done [ -z "$tokens" ] && token_list="None!token0!token1" # === Загрузка data=("" "" "" "" "" "" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "None" "None" "" "shared" "nla" "FALSE" "") while true; do form=$(yad --notebook \ --title="Подключение к RDP (FreeRDP)" \ --width=600 --height=540 \ --center \ --separator="|" \ --form \ --tab="Основное" \ --field="Сервер (обязательно):" "${data[0]}" \ --field="Порт:" "${data[1]}" \ --field="Имя пользователя:" "${data[2]}" \ --field="Пароль (скрыт):H" "${data[3]}" \ --field="Домен (опционально):" "${data[4]}" \ --field="Разрешение экрана:" "${data[5]}" \ --tab="Параметры" \ --form \ --field="Полноэкранный режим:CHK" "${data[6]}" \ --field="Динамическое изменение экрана:CHK" "${data[7]}" \ --field="Отключить проверку сертификата:CHK" "${data[8]}" \ --field="Перенаправлять звук:CHK" "${data[9]}" \ --field="Переподключаться при обрыве:CHK" "${data[10]}" \ --field="Принтер:CB" "${data[11]:-None}!${printer_list#None!}" \ --field="Смарт-карта (токен):CB" "${data[12]:-None}!${token_list#None!}" \ --field="Папка для перенаправления:DIR" "${data[13]}" \ --field="Имя общей папки (в сессии):" "${data[14]}" \ --tab="Безопасность" \ --form \ --field="Тип шифрования:CB" "${data[15]:-nla}!nla!tls!rdp!neg" \ --field="Команда подключения:TXT" "${data[17]}" ) [ $? -ne 0 ] && exit 0 IFS="|" read server port username password domain resolution \ fullscreen dynres cert_ignore sound autoreconnect \ printer_choice smartcard_choice folder_redirect folder_name encryption save_on_exit show_command <<< "$form" # Формируем команду cmd="xfreerdp /v:$server" [ -n "$port" ] && cmd+=":$port" cmd+=" /u:$username /p:$password" [ -n "$domain" ] && cmd+=" /d:$domain" if [ "$fullscreen" = "TRUE" ]; then cmd+=" /f" elif [ -n "$resolution" ]; then width=$(echo "$resolution" | cut -d'x' -f1) height=$(echo "$resolution" | cut -d'x' -f2) cmd+=" /size:${width}x${height}" fi [ "$dynres" = "TRUE" ] && cmd+=" +dynamic-resolution" [ "$cert_ignore" = "TRUE" ] && cmd+=" /cert:ignore" [ "$sound" = "TRUE" ] && cmd+=" /sound" [ "$autoreconnect" = "TRUE" ] && cmd+=" /auto-reconnect" [ "$printer_choice" != "None" ] && cmd+=" /printer:$printer_choice" [ "$smartcard_choice" != "None" ] && cmd+=" /smartcard:$smartcard_choice" if [ -n "$folder_redirect" ]; then safe_name="${folder_name:-shared}" cmd+=" /drive:$safe_name,$folder_redirect" fi case "$encryption" in nla) cmd+=" /sec:nla" ;; tls) cmd+=" /sec:tls" ;; rdp) cmd+=" /sec:rdp" ;; neg) cmd+=" /sec:neg" ;; esac # Показываем в текстовом поле data=("$server" "$port" "$username" "$password" "$domain" "$resolution" \ "$fullscreen" "$dynres" "$cert_ignore" "$sound" "$autoreconnect" \ "$printer_choice" "$smartcard_choice" "$folder_redirect" "$folder_name" \ "$encryption" "$save_on_exit" "$cmd") # Следующий запуск покажет обновлённое значение done