Esecuzione di un comando senza ereditare l'ambiente del genitore


14

C'è un modo per eseguire un comando "come se" fosse in una nuova sessione di accesso?

Ho già provato env -i. Tuttavia, non voglio trattare varie variabili ENV che devo impostare o non impostare.

Ho anche provato bash -c "some command"e bash -l -c "some commmand", ma tutti copiano l'ambiente attuale.

Il più vicino che sono arrivato è una soluzione di ghetto: ssh me@localhost "some command"


Utilizzare /bin/bash --loginper ottenere quel comportamento. Lo uso ad esempio per ottenere un vero $PATH.
Daniel Beck

Questo è l'equivalente di /bin/bash --l, che ho già provato. Copia l'ambiente originale. Provalo: export SOME_VAL=something. Poi /bin/bash --login. Poi env | grep SOME_VAL. Il valore sarà lì.
dgo.a,

Risposte:


12

Ecco una risposta che non richiede i privilegi di sudo o la password dell'utente, ma fornisce comunque un ambiente come quello che avresti ottenuto con un nuovo accesso.

env -i HOME="$HOME" bash -l -c 'your_command'

Esempio:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

Abbattendo questo per una spiegazione:

  1. env -i HOME="$HOME": Cancella l'ambiente. Gli -iinsiemi di un ambiente vuoto con nessuna variabile di sorta . Questo è problematico perché significa che se si tenta di eseguire in modo ingenuo bash -lnon caricherà il tuo .bash_profileecc. Perché HOMEnon è impostato. Per mitigarlo, passiamo esplicitamente HOME="$HOME", creando un ambiente in cui HOME(e solo HOME) è impostato.

  2. bash -l -c ...: Esegue il comando desiderato in una shell di accesso. Avrai bisogno di una shell di accesso per questo perché stiamo iniziando da un ambiente pulito e abbiamo bisogno di ricaricare tutto.

In particolare:

  • Questo non richiede i privilegi di sudo (la sudoversione lo fa).
  • Questo non richiede di digitare la password dell'utente (la suversione lo fa).
  • Ciò non richiede l'esecuzione di un server SSH e una chiave senza password che può essere utilizzata per accedere nuovamente alla macchina (la sshversione sì).

Grazie Elliott. Sembra così semplice ed ovvio ... ora che mi è stato segnalato.
dgo.a,

12
su -l $USER

sudo -u $USER -i

Per qualcosa di ancora più aggressivo env -i bash, provate , ma questo annulla tutto, inclusi $ HOME e $ TERM.


2
Grazie! Il secondo comando mi dà esattamente quello che voglio. Ho cercato per più di 2 ore e non ho trovato nulla vicino alla tua risposta. Sulla base della tua risposta, sono tornato indietro man sudoe ho trovato: "se l'utente di destinazione è uguale all'utente che invoca, non è richiesta alcuna password". ( suSembra che richieda sempre una password.) Sono così sciocco da aver trascurato qualcosa di così semplice nel primo paragrafo di una manpagina :( Ho evitato sudo in primo luogo perché ho pensato che chiedesse sempre una password. Grazie di nuovo!
dgo.a

1
solo un suggerimento per gli altri ... se hai effettuato l'accesso in quanto $USERdovrai accedere come root e poi sudo -u ...come utente. Se fai semplicemente sudo -ucome utente, erediterai.
Adam Gent,

questo non funziona, ovviamente, se non si ha sudoaccesso. Esiste un metodo alternativo che non richiede sudo?
user5359531

@ user5359531: Sì - su -l $USER.
user1686

1
che richiede una password; Ho effettuato l'accesso tramite autenticazione con chiave ssh, quindi non so nemmeno quale sia la password. E una richiesta di password ucciderà l'abilità di script. Finora sembra che ssh $USER@localhost <command>
funzioni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.