2013-01-22 11 views
5

Come creare comandi personalizzati per git-shell? Secondo lo documentation:Comandi personalizzati con git-shell

Quando viene fornito -c, il programma viene eseguito in modo non interattivo; può essere uno di git receive-pack, git upload-pack, git upload-archive, cvs server o un comando in COMMAND_DIR. La shell è avviata in modalità interattiva quando non vengono forniti argomenti; in questo caso, deve esistere COMMAND_DIR e qualsiasi degli eseguibili in esso contenuti può essere invocato .

Tuttavia, non sono sicuro di averlo capito correttamente. Ho creato un utente chiamato gituser e gli ho dato/usr/bin/git-shell come shell. Ho creato una directory chiamata git-shell-commands e ho inserito uno script chiamato 'testy', ma non riesco a farlo funzionare tramite git-shell.

Ecco che cosa sto provando da un altra macchina:

$ ssh [email protected] testy 
fatal: unrecognized command 'testy' 

noti che git-shell sta lavorando, e rispondendo, semplicemente non riesce a trovare il mio comando personalizzato.

E qui è lo script:

:/home/gituser/git-shell-commands# ls -l -a 
total 12 
drwxr-xr-x 2 gituser gituser 4096 Jan 22 17:35 . 
drwxr-xr-x 4 gituser gituser 4096 Jan 22 13:57 .. 
-rwxr-xr-x 1 gituser gituser 26 Jan 22 13:58 testy 
:/home/gituser/git-shell-commands# ./testy 
hello! 
:/home/sodigit/git-shell-commands# cat testy 
echo "hello!" 

Che cosa sto facendo di sbagliato? Come eseguire comandi personalizzati con git-shell?

+0

Come hai iniziato git-shell? Hai definito 'COMMAND_DIR'? –

+0

Non l'ho definito. Presumo che sia $ HOME/git-shell-commands dove $ HOME è la directory home di gituser (/ home/gituser). Io uso ssh per accedere a git-shell come nell'esempio sopra. – mimrock

+0

La documentazione afferma chiaramente che gli script devono essere collocati all'interno di 'COMMAND_DIR'. Se non sai a quale directory punta, come puoi inserire i file al suo interno? –

risposta

5

Come si è scoperto, questa funzione è stata introdotta in git 1.7.4. Sto usando debian squeeze, che contiene una versione precedente di git, quindi è per questo che non ha funzionato.

Se si verifica questo problema, controllare la versione di Git.

Tuttavia, a partire da git 1.7.10, i comandi personalizzati funzionano solo in modalità interattiva e non con -c. Non ho ancora provato il git più recente, quindi è possibile che questo problema non sia correlato alla versione del software.

+0

+1 Ho appena avuto lo stesso identico problema, mi hai salvato giorni di debug, grazie. – ehime

1

Per consentire comandi personalizzati per il pre-1.7.4 (e in modalità non interattiva per 1.7.10), è possibile utilizzare un wrapper script di shell per git-shell:

#!/bin/bash                  

cmdline=($1) 
cmd=$(basename "${cmdline[0]}") 

if [ -z "$cmd" ] ; then 
    exec git-shell 
elif [ -n "$cmd" -a -x ~/git-shell-commands/"$cmd" ] ; then 
    ~/git-shell-commands/"$cmd" "${cmdline[@]:1}" 
else 
    exec git-shell -c "$1" 
fi 

Ovunque si farebbe normalmente usa "git-shell", fai invece riferimento a questo script, ma lascia fuori qualsiasi argomento "-c" per questo script.

Come con git-shell, lo script precedente richiede che l'intera riga di comando venga passata come primo argomento. Se si preferisce passare la linea di comando come argomenti separati:

#!/bin/bash                  

cmd=$(basename $1) 

if [ -z "$cmd" ] ; then 
    exec git-shell 
elif [ -n "$cmd" -a -x ~/git-shell-commands/"$cmd" ] ; then 
    shift 
    ~/git-shell-commands/"$cmd" "[email protected]" 
else 
    exec git-shell -c "$*" 
fi 

Ad esempio, questo consente di richiamare la shell ristretta in authorize_keys come:

command="sshsh $SSH_ORIGINAL_COMMAND" ... 

nota che nessuno dei due script crea un modo interattivo per pre-1.7.4 (il tentativo di avviare una sessione interattiva comporterà un errore "fatale: cosa credi che io sia? una shell?" da git-shell), ma non dovrebbe interferire con la modalità interattiva in 1.7.4 e più nuovo.

Disclaimer: questo non è stato controllato per i buchi di sicurezza. Utilizzare a proprio rischio. In particolare, ogni comando in ~/git-shell-commands è un potenziale buco di sicurezza (sebbene questo sia vero per git-shell 1.7.4 e successive, anche senza nessuno degli script di cui sopra).