С KDE 3 всё относительно просто:
/usr/kde/3.5/bin/dcop --all-users --all-sessions kdesktop KScreensaverIface lock
А вот с Gnome пришлось немного повозиться. Вот результат:
#!/bin/sh
export LANG=C
LOCK_CMD="/usr/bin/dbus-send --dest=org.gnome.ScreenSaver --type=method_call /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock"
for i in /proc/*/environ; do
[ -r "${i}" ] || continue
user=$( stat -c "%U" "${i}" )
tr "\0" "\n" < "${i}" | sed -n "s/^DBUS_SESSION_BUS_ADDRESS=\(.*\)$/${user} \1/p"
done | sort | uniq | while read l; do
user=$( echo "${l}" | cut -d " " -f 1 )
dbus_sess=$( echo "${l}" | cut -d " " -f 2 )
export DBUS_SESSION_BUS_ADDRESS="${dbus_sess}"
su "${user}" -c "${LOCK_CMD}" > /dev/null 2>&1 && exit
done
Возможно есть более простой и правильный способ, но я его не нашёл.
Зачем это надо? Например чтобы блокировать сессию перед s2ram в скрипте для acpid.