Pertanyaan Bagaimana cara mengubah Gsettings melalui shell jarak jauh?


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

Sayangnya, doa dari gsettings melalui ssh atau terminal virtual memberikan:

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

Saat saya mengatur $DISPLAY dengan export DISPLAY=:0.0 itu memberi kesalahan lain:

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

Apa yang dapat saya?


22
2018-04-28 13:33


asal




Jawaban:


Kuncinya adalah mengatur DBUS_SESSION_BUS_ADDRESS variabel lingkungan.

Di utas ini Saya menemukan skrip berikut, yang membantu mendapatkan nilai yang benar dari variabel itu. Ini membutuhkan nama proses, yang berjalan di desktop, di mana kita ingin mengubah pengaturan dbus. (Ada lebih dari 1 sesi grafis yang berjalan secara paralel). Kita sebut saja discover_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 bisa melakukan yang berikut, dengan asumsi itu unity sedang berjalan di desktop, di mana kami ingin menerapkan pengaturan kami:

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

Dan hal-hal harus berfungsi dengan baik.


22
2018-04-28 13:37



Ini bekerja dengan baik untuk saya! - sancho.s


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

Solusi ini https://askubuntu.com/a/326773 melakukan trik untuk saya tanpa semua memancing untuk koneksi aktif dan mencoba spoof lingkungan. YMMV ...


4
2018-01-27 02:06





Saya memiliki skrip POST-Install yang mengatur gsetting saya. Karena saya menjalankan skrip sebagai sudo EUID adalah 0, maka saya harus menemukan $ RUID (ID Pengguna Nyata).

di sini adalah 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

-1
2017-11-05 21:40



ID pengguna Anda sudah disimpan dalam $USER variabel lingkungan, dan UID Anda di $UID variabel. Saat berlari sudo, mereka di $SUDO_USER dan $SUDO_UID variabel. Yang mengatakan, mengapa Anda bahkan menjalankan ini dengan sudo di tempat pertama? Menggunakan sudo -u $YOUR_USER sama seperti tidak menggunakan sudo sama sekali. Akhirnya, Anda who | awk . . . perintah tidak bisa anda ID, itu mencetak semua ID dari semua pengguna saat ini masuk ke sistem. - terdon♦