Quando lavoro sulla riga di comando, cambio spesso a sudo usando sudo -i
. Tuttavia, la mia directory di lavoro cambia automaticamente in /root
. Non voglio mai andarci; Voglio rimanere dove ero! Come posso raggiungere questo obiettivo?
Quando lavoro sulla riga di comando, cambio spesso a sudo usando sudo -i
. Tuttavia, la mia directory di lavoro cambia automaticamente in /root
. Non voglio mai andarci; Voglio rimanere dove ero! Come posso raggiungere questo obiettivo?
Risposte:
È possibile utilizzare sudo -s
invece, non cambierebbe la directory corrente in /root
, anche se alcune delle variabili di ambiente non sarebbero quelle di root.
Questa pagina dai forum di Ubuntu ha un bel riassunto:
Summary of the differences found
corrupted by user's
HOME=/root uses root's PATH env vars
sudo -i Y Y[2] N
sudo -s N Y[2] Y
sudo bash N Y[2] Y
sudo su Y N[1] Y
Questa pagina dalla documentazione di Ubuntu contiene molte più informazioni di base su sudo .
sudo -iu
funziona per me ubuntuforums.org/…
sudo -i
è ancora corrotto da env vars dell'utente. L'unico modo per evitarlo è usare su -l
.
Se vuoi usare su
, c'è un modo per rimanere nella stessa directory.
su - user -c "cd` pwd`; bash "
Cosa sta succedendo qui:
su - user
= accedi come user
-c
che significa "esegui un comando nella shell del nuovo utente"-c "cd `pwd`"
il comando che diamo è di passare alla directory corrente ( `pwd`
) - ma poiché usiamo i backtick tra virgolette doppie, il pwd
comando viene valutato prima di eseguire il su
comando, in modo da passare alla directory in cui ci troviamo ADESSO come vecchio utente.
-c 'cd `pwd`'
eseguirà il pwd
comando nella nuova shell, quindi valuterebbe ciò cd /root
, che, ovviamente, non compirà nulla.L'unico problema qui è che la nuova shell esce subito dopo aver eseguito il comando, quindi aggiungiamo:
-c "cd `pwd`; bash"
che significa "esegui bash
(nuova shell) dopo aver eseguito il cd
comando. La shell bash non si chiude fino a quando non ci disconnettiamo da esso.Si noti che è possibile sostituire `pwd`
con $(pwd)
. Funzionalmente sono uguali, ma l'abbondanza di personaggi simili a virgolette può diventare difficile da leggere.
Ho riscontrato lo stesso problema e non mi è permesso eseguire altro che sudo su - devuser
sul server di sviluppo, quindi questo è quello che mi è venuto in mente:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/bin/bash
#brings you back home after sudo su
function get_owner {
pid=$1
echo $(ps ouid -p $pid h | tr -d ' ')
}
pid=$$
my_uid=$(get_owner $pid)
uid=$my_uid
i=0
while [[ $uid == $my_uid && $i -lt 20 ]] ; do
pid=$(ps -o ppid= $pid)
uid=$(get_owner $pid)
i=$((i+1))
done
user_home=$(getent passwd $uid | cut -d ':' -f '6')
if [[ -d $user_home && $uid != 0 ]] ; then
echo $user_home
fi
Va su un albero dei processi e controlla se l'utente proprietario del processo è cambiato.