Bagaimana cara mengubah Gsettings melalui shell jarak jauh?

23

Saya perlu mengotomatisasi konfigurasi desktop melalui Wayang, terminal virtual atau ssh.

Sayangnya, doa gsettingsvia ssh atau terminal virtual memberi:

gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize "4"

(process:29520): dconf-WARNING **: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY

Ketika saya mengatur $DISPLAYdengan export DISPLAY=:0.0itu memberikan kesalahan lain:

(process:29862): dconf-WARNING **: failed to commit changes to dconf: Could not connect: Connection refused

Apa yang dapat saya?

Adam Ryczkowski
sumber
Di Ubuntu 18.04 Anda mungkin perlu mengatur tidak hanya DBUS_SESSION_BUS_ADDRESS, tetapi juga XDG_RUNTIME_DIR.
mejem

Jawaban:

23

Kuncinya adalah mengatur DBUS_SESSION_BUS_ADDRESSvariabel lingkungan.

Di utas ini saya menemukan skrip berikut, yang membantu untuk mendapatkan nilai yang benar dari variabel itu. Itu membutuhkan nama proses, yang berjalan di desktop, di mana kami ingin mengubah pengaturan dbus. (Bisa ada lebih dari 1 sesi grafik berjalan secara paralel). Mari kita sebut sajadiscover_session_bus_address.sh

#!/bin/bash

# Remember to run this script using the command "source ./filename.sh"

# Search these processes for the session variable 
# (they are run as the current user and have the DBUS session variable set)
compatiblePrograms=( nautilus kdeinit kded4 pulseaudio trackerd )

# Attempt to get a program pid
for index in ${compatiblePrograms[@]}; do
    PID=$(pidof -s ${index})
    if [[ "${PID}" != "" ]]; then
        break
    fi
done
if [[ "${PID}" == "" ]]; then
    echo "Could not detect active login session"
    return 1
fi

QUERY_ENVIRON="$(tr '\0' '\n' < /proc/${PID}/environ | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)"
if [[ "${QUERY_ENVIRON}" != "" ]]; then
    export DBUS_SESSION_BUS_ADDRESS="${QUERY_ENVIRON}"
    echo "Connected to session:"
    echo "DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS}"
else
    echo "Could not find dbus session ID in user environment."
    return 1
fi

return 0

Dengan skrip ini kita dapat melakukan hal berikut, dengan asumsi unityproses sedang berjalan di desktop, di mana kita ingin menerapkan pengaturan kita:

. ./discover_session_bus_address.sh unity
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize "4"

Dan semuanya akan beres.

Adam Ryczkowski
sumber
Ini bekerja segera untuk saya!
sancho.s Reinstate Monica
4

Saya mengalami masalah yang sama saat mencoba membuat perubahan pengaturan untuk gambar gelandangan melalui SSH selama penyediaan.

Solusi ini /ubuntu//a/326773 melakukan trik untuk saya tanpa memancing untuk koneksi aktif dan mencoba menipu lingkungan. YMMV ...

JELaVallee
sumber
-1

Saya memiliki skrip POST-Install yang mengatur gsetting saya. Karena saya menjalankan skrip sebagai sudo EUID adalah 0, karena itu saya harus mencari $ RUID (Real User ID).

inilah pendekatan saya:

#!/usr/bin/env bash
# Get the Real Username
RUID=$(who | awk 'FNR == 1 {print $1}')

# Translate Real Username to Real User ID
RUSER_UID=$(id -u ${RUID})

# Set gsettings for the Real User
sudo -u ${RUID} DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/${RUSER_UID}/bus" gsettings set org.gnome.desktop.interface clock-show-date false

exit
caracal
sumber
ID pengguna Anda sudah disimpan dalam $USERvariabel lingkungan, dan UID Anda dalam $UIDvariabel. Saat berjalan sudo, mereka berada di $SUDO_USERdan $SUDO_UIDvariabel. Yang mengatakan, mengapa Anda bahkan menjalankan ini dengan sudodi tempat pertama? Menggunakan sudo -u $YOUR_USERsama seperti tidak menggunakan sudosama sekali. Akhirnya, who | awk . . .perintah Anda tidak mendapatkan ID Anda , ia mencetak semua ID dari semua pengguna yang saat ini masuk ke sistem.
terdon