Forza SSH a utilizzare una shell specifica


29

Esiste un modo per forzare SSH a utilizzare una shell particolare sull'estremità remota, indipendentemente dalla shell predefinita dell'utente?

Ho provato soluzioni simili a:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

ma sfortunatamente la shell di default sull'estremità remota è responsabile dell'analisi della parte "comando complicato, multilinea", e ho difficoltà a sfuggirla sufficientemente per funzionare sia per gli utenti della shell Bash che C.


Risposte:


8

Non credo sia possibile, almeno con i sistemi basati su openssh. Se hai la possibilità, una soluzione migliore potrebbe essere quella di sftp su un file shell-script e quindi eseguirlo con il metodo che hai pubblicato. Avrebbe il vantaggio di ridurre al minimo la quantità di escape necessaria, ma lascerebbe indietro un file che dovrebbe essere rimosso (forse come l'ultimo passo dello script).


1
Questo è quello che alla fine ho fatto, ma usando scp. Una grande idea.
Plinehan,

16

Usa un heredoc:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

non dovresti usare "-s" per bash per leggere i comandi da stdin?
Weboide,

Non è sempre richiesto.
Ignacio Vazquez-Abrams,

Voterei questo se potessi perché impedisce ai comandi di accedere a stdin e la domanda riguardava l'invocazione di una particolare shell.
Eric Woodruff,

3
@EricWoodruff, ... invocare una shell particolare (in questo caso bash) è esattamente ciò che mostra come fare.
Charles Duffy,

1
Cordiali saluti, puoi anche fare cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. Quindi invece di un passaggio hai due passaggi: passaggio 1 copia lo script in un file, passaggio 2 catlo script in ssh.
Trevor Boyd Smith,

10

Utilizzare accessi basati su chiave, non basati su password. Quindi puoi aggiungere un (elenco di) "comandi forzati" alla tua chiave pubblica ssh (nel campo "opzioni" nel caso di SSH1) che è installato sul server (nel file ~ / .ssh / authorized_keys per SSH1 , ~ / .ssh2 / autorizzazione per SSH2).

Esegui il comando forzato in modo che la shell desiderata venga chiamata ...

Altro: è possibile associare al massimo un comando forzato a una determinata chiave. Se sono necessari più comandi forzati per scopi diversi, è necessario impostare diversi tasti. (Ovviamente puoi mettere più cose in uno script, che chiami tramite comando forzato. Ma tieni presente che i comandi forzati vengono sempre eseguiti per un determinato account / chiave se l'utente accede, indipendentemente dal fatto che abbia richiesto l'esecuzione di qualcosa di diverso. Se vuoi ancora onorare il comando originale richiesto, dai un'occhiata a come sfruttare la $SSH_ORIGINAL_COMMANDvariabile ...)

Leggi i "comandi forzati" tramite Google .


Roba buona. Quella grafica sulla pagina di O'Reilly è molto bella. Nel mio caso particolare, tuttavia, voglio essere in grado di forzare questo per tutti gli utenti, non solo per gli utenti che hanno impostato correttamente le loro chiavi. Inoltre non ho root sui computer server, quindi non posso modificare file come /etc/sshrc.
Plinehan,

Bene, è sempre il server (o meglio: quello che esercita il controllo sul server) a chiamare i colpi quando ci si connette al suo servizio .... Il "proprietario" del server decide cosa si può fare con esso. - Non puoi forzare nulla "per qualsiasi utente" se non hai privilegi più alti di loro.
Kurt Pfeifle,

Se il client può eseguire comandi arbitrari, anche il client può eseguire una shell arbitraria come comando.
Eric Woodruff,

@KurtPfeifle che interrompe il collegamento a O'Reilly
Brian Vandenberg

@BrianVandenberg: Grazie per il suggerimento. Ho rimosso quel link ora.
Kurt Pfeifle,

2

È possibile utilizzare l' -topzione per forzare l'allocazione di una pseudo-tty per il programma che si desidera avviare, come se si stesse eseguendo la shell standard. Quindi passa la shell che desideri come semplice vecchio argomento.

Con questa tecnica sei in grado non solo di utilizzare qualsiasi shell installata, ma puoi anche aprire vim e altri programmi che richiedono un TTY, da un singolo comando. Il che è bello se stai scrivendo uno script di shell che ti accede da qualche parte e apre un file su vim, o htop o qualcosa del genere.

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

Non sono sicuro che si tratti di una shell di accesso, ma ci sono opzioni per far sì che bash si comporti come una shell di accesso, quindi anche la shell potrebbe avere quella.


1

Sorprendentemente vedo risultati diversi con i seguenti:

correre nel trattino:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Mostrando il comando completamente citato funziona come previsto.


1
Non sorprende affatto. Il demone ssh remoto funziona in modo efficace sh -c "$*". Quindi stai correndo sh -c "/bin/bash -c echo <(cat)"; il echocomando stesso è l'unico argomento a cui è passato -c, mentre il <(cat)è un argomento separato del tutto.
Charles Duffy,

0

Ho affrontato una situazione simile qualche tempo fa, dove avevo bisogno di usare ksh coprocess per sqlplus e avevo solo un ssh attraverso il quale dovevano aver luogo le letture e le scritture.

Un modo per fare ciò è reindirizzare tutti i comandi dipendenti in una riga (usa;) a / usr / bin / ksh sul computer remoto. per esempio:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
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.