Come inviare dati agli Appunti locali da una sessione SSH remota


161

Borderline ServerFault domanda, ma sto programmando alcuni script di shell, quindi provo prima qui :)

La maggior parte dei * nix ha un comando che ti consentirà di reindirizzare / reindirizzare l'output negli appunti / pasteboard locali e di recuperare dallo stesso. Su OS X questi comandi sono

pbcopy, pbpaste 

Esiste un modo per replicare questa funzionalità mentre SSHed in un altro server? Questo è,

  1. Sto usando Computer A.
  2. Apro una finestra terminale
  3. I SSH sul computer B
  4. Eseguo un comando sul computer B
  5. L'output del Computer B viene reindirizzato o copiato automaticamente negli Appunti del Computer A.

E sì, lo so che potrei semplicemente (rabbrividire) usare il mouse per selezionare il testo dal comando, ma mi sono abituato così tanto al flusso di lavoro del pipping output direttamente negli Appunti che voglio lo stesso per le mie sessioni remote.

Il codice è utile, ma anche gli approcci generali sono apprezzati.

Risposte:


89

Sto resuscitando questo thread perché ho cercato lo stesso tipo di soluzione e ne ho trovato uno che funziona per me. È una modifica minore a un suggerimento di OSX Daily .

Nel mio caso, utilizzo Terminal sul mio computer OSX locale per connettermi a un server Linux tramite SSH. Come l'OP, volevo essere in grado di trasferire piccoli frammenti di testo dal terminale agli appunti locali, usando solo la tastiera.

L'essenza della soluzione:

commandThatMakesOutput | ssh desktop pbcopy

Quando eseguito in una sessione ssh su un computer remoto, questo comando prende l'output di commandThatMakesOutput (ad esempio ls, pwd) e convoglia l'output negli Appunti del computer locale (il nome o IP di "desktop"). In altre parole, usa ssh nidificato: sei connesso al computer remoto tramite una sessione ssh, esegui lì il comando e il computer remoto si collega al desktop tramite una sessione ssh diversa e inserisce il testo negli appunti.

Richiede che il tuo desktop sia configurato come un server SSH (che lascio a te e a Google). È molto più semplice se hai impostato i tasti ssh per facilitare un rapido utilizzo di ssh, preferibilmente usando una passphrase per sessione o qualunque cosa le tue esigenze di sicurezza richiedano.

Altri esempi:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

Per comodità, ho creato un file bash per abbreviare il testo richiesto dopo la pipe:

#!/bin/bash
ssh desktop pbcopy

Nel mio caso, sto usando una chiave con un nome speciale

L'ho salvato con il nome del file cb (my mnemonic (ClipBoard). Metti lo script da qualche parte nel tuo percorso, rendilo eseguibile e voilà:

ls | cb

3
Ci vado spesso in vim. Per fare ciò, selezionare ciò che si desidera copiare in modalità visiva, quindi digitare::'<,'>w !ssh desktop pbcopy
Mike Brennan,

@MikeBrennan Quando hai selezionato il testo, perché non premi semplicemente cmd + C (o qualsiasi tasto di copia che hai impostato)? ...
Petr Peller,

36
In questo modo funziona davvero solo quando il tuo desktop ha un IP statico ed è raggiungibile dalla casella in cui sei entrato. Non è mai il caso per me.
kqw,

6
Il contrario non sarebbe più facile? ssh user @ remote 'commandThatMakesOutput' | pbcopy
rulio

Avevo bisogno della -e nonebandiera ssh descritta qui: unix.stackexchange.com/questions/210615/…
Pat Myron,

122

Il mio modo preferito è ssh [remote-machine] "cat log.txt" | xclip -selection c. Questo è molto utile quando non si desidera (o non si può) ssh da remoto a locale.

Modifica: su Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Modifica: un utile commento di nbren12:

È quasi sempre possibile impostare una connessione SSH inversa utilizzando il port forwarding SSH. Basta aggiungere RemoteForward 127.0.0.1:2222 127.0.0.1:22alla voce del server nel proprio locale .ssh/config, quindi eseguire ssh -p 2222 127.0.0.1sul computer remoto, che reindirizzerà quindi la connessione al computer locale. - nbren12


6
+1: Molto più semplice rispetto ad altre soluzioni quando non è possibile una connessione SSH inversa!
John Dibling,

9
Ti meriti più Mi piace per quella soluzione estremamente semplice!
Kamil Dziedzic,

31
Per quelli di noi su Mac OSX,ssh [remote-machine] "cat log.txt" | pbcopy
Chowey,

1
Come da questo rapporto qui , ho dovuto usare catper farlo funzionare su Cygwin Windows 8: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(ovviamente, il mio comando remoto non era cat; era qualcos'altro all'interno di una macchina virtuale vagabonda quindi ho effettivamente eseguito vagrant ssh -c "command" | cat > /dev/clipboard)
tiby

7
È quasi sempre possibile impostare una connessione SSH inversa utilizzando il port forwarding SSH. È sufficiente aggiungere RemoteForward 127.0.0.1:2222 127.0.0.1:22alla voce server nel proprio locale .ssh/config, quindi eseguire ssh -p 2222 127.0.0.1sul computer remoto, che reindirizzerà quindi la connessione al computer locale.
nbren12,

30

Trovata un'ottima soluzione che non richiede una connessione SSH inversa!

È possibile utilizzare xclip sull'host remoto, insieme all'inoltro ssh X11 e XQuartz sul sistema OSX.

Per impostare questo:

  1. Installa XQuartz (l'ho fatto con soloist + pivotal_workstation :: ricetta xquartz , ma non è necessario)
  2. Esegui XQuartz.app
  3. Apri le preferenze di XQuartz ( kb_command+ ,)
  4. Assicurati che "Abilita sincronizzazione" e "Aggiorna tastiera quando le modifiche alla CLIPBOARD" siano selezionati Esempio di finestra Preferenze di XQuartz
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

1
In che modo differisce ssh remote-host "echo 'hello from remote-host' | pbcopy? Sarebbe un'ottima risposta se funzionasse in questo modo: ssh -X remote-hostsull'host remoto:echo 'hello from remote-host' | xclip -selection clipboard
kqw

5
@KasperSouren. Credo che funzioni come speri. Il | | xclip` è racchiuso tra virgolette doppie.
gdw2,

1
Nel 2016, questa è ovviamente la migliore soluzione senza fronzoli. Dimentica altre soluzioni basate su reverse-ssh.
Shivams,

1
C'è un modo per farlo senza che sia solo un comando una tantum? Voglio essere registrato nel mio server remoto in una sessione interattiva su ssh e quindi essere in grado di inviare arbitrariamente agli appunti locali. Ciò richiede reverse ssh?
Kvas

2
@Kvass: Fintanto che stai usando -XX11 Forwarding over SSH, i programmi X11 saranno in grado di aggiornare i tuoi appunti tramite le impostazioni XQuartz sopra. Il comando una tantum è dimostrare che l'invio di qualcosa tramite echogli appunti dell'host remoto tramite xclipfunziona e deve essere sincronizzato con l'host client SSH locale. Nota come dice @ gdw2, "È racchiuso tra | xclipvirgolette doppie". Come tale, verrà eseguito come comando sul server remoto per inviare qualcosa ai suoi appunti.
TrinitronX,

18

Porta tunnel inversa sul server SSH

Tutte le soluzioni esistenti richiedono:

  • X11 sul client (se presente, xclipsul server funziona alla grande) o
  • il client e il server devono trovarsi nella stessa rete (il che non è il caso se stai cercando di accedere al tuo computer di casa).

Ecco un altro modo per farlo, anche se dovrai modificare il modo in cui ssh nel tuo computer.

Ho iniziato a usarlo e non è affatto intimidatorio come sembra, quindi provalo.

Client (avvio sessione ssh)

ssh username@server.com -R 2000:localhost:2000

(suggerimento: rendi questo un keybinding in modo da non doverlo digitare)

Cliente (un'altra scheda)

nc -l 2000 | pbcopy

Nota: se non lo hai, pbcopybasta teeinserirlo in un file.

Server (all'interno della sessione SSH)

cat some_useful_content.txt | nc localhost 2000

Altre note

In realtà anche se sei nel mezzo di una sessione ssh c'è un modo per avviare un tunnel ma non voglio spaventare la gente da ciò che non è poi così male come sembra. Ma aggiungerò i dettagli più avanti se vedo qualche interesse


1
+1 - è abbastanza pulito. Tuttavia - il cat some_useful_content.txt | nc localhost 2000comando sembra bloccarsi quando lo faccio. Ho bisogno di ctr-c manualmente per fermarlo, ed è solo allora che il contenuto arriva al mio clip / pasteboard del mio cliente
Alan Storm,

1
Aspetterà fino a quando qualcuno non liquefarrà i dati all'altra estremità.
Sridhar Sarnobat,

In realtà penso di aver frainteso la tua domanda. Non sono sicuro del perché ciò accada.
Sridhar Sarnobat,

nc -l -pfunziona per me, ma proprio nc -lno. E ho anche il problema di @AlanStorm.
HappyFace,

1
Ho risolto il problema di appendere netcat specificando -c. Uso GNU netcat installato da brew.
HappyFace,

7

Esistono vari strumenti per accedere alle selezioni X11, tra cui xclip e XSel . Nota che X11 ha tradizionalmente selezioni multiple e la maggior parte dei programmi ha una certa comprensione sia degli appunti che della selezione primaria (che non sono uguali). Emacs può funzionare anche con la selezione secondaria, ma questo è raro e nessuno sa davvero cosa fare con i buffer di taglio ...

$ xclip -help
Utilizzo: xclip [OPTION] [FILE] ...
Accedi a una selezione di server X per leggere o scrivere.

  -i, -in legge il testo nella selezione X da input o file standard
                   (predefinito)
  -o, -out stampa la selezione su standard out (generalmente per
                   piping su un file o programma)
  -l, -loops il numero di richieste di selezione da attendere prima di uscire
  -d, -display X display a cui connettersi (es. localhost: 0 ")
  -h, -help informazioni sull'utilizzo
      -selezione selezione per accedere ("primario", "secondario", "appunti" o "buffer-cut")
      -noutf8 non tratta il testo come utf-8, usa il vecchio Unicode
      -version informazioni sulla versione
      solo errori silenziosi, eseguito in background (impostazione predefinita)
      -quiet corri in primo piano, mostra cosa sta succedendo
      -verbose commento in esecuzione

Segnala i bug a <astrand@lysator.liu.se>
$ xsel -help
Utilizzo: xsel [opzioni]
Manipola la selezione X.

Per impostazione predefinita, la selezione corrente viene emessa e non modificata se entrambi
input standard e output standard sono terminali (ttys). Altrimenti,
la selezione corrente viene emessa se l'uscita standard non è un terminale
(tty) e la selezione viene impostata dall'input standard se input standard
non è un terminale (tty). Se vengono fornite opzioni di input o output
il programma si comporta solo nella modalità richiesta.

Se sono richiesti sia input che output, la selezione precedente è
output prima di essere sostituito dal contenuto dell'input standard.

Opzioni di input
  -a, --append Aggiunge input standard alla selezione
  -f, --segui Aggiungi alla selezione man mano che l'input standard aumenta
  -i, --input Leggi l'input standard nella selezione

Opzioni di output
  -o, --output Scrive la selezione sullo standard output

Opzioni di azione
  -c, --clear Cancella la selezione
  -d, --delete Richiede che la selezione venga cancellata e quella
                        l'applicazione proprietaria ne elimina il contenuto

Opzioni di selezione
  -p, --primary Operare sulla selezione PRIMARY (impostazione predefinita)
  -s, --secondary Operare sulla selezione SECONDARIA
  -b, --clipboard Operare sulla selezione CLIPBOARD

  -k, --keep Non modifica le selezioni, ma effettua PRIMARY
                        e le selezioni SECONDARIE persistono anche dopo il
                        programmi sono stati selezionati in uscita.
  -x, --exchange Scambia le selezioni PRIMARY e SECONDARY

X opzioni
  --display displayname
                        Specifica la connessione al server X.
  -t ms, --selectionTimeout ms
                        Specificare il timeout in millisecondi entro il quale il file
                        la selezione deve essere recuperata. Un valore di 0 (zero)
                        specifica nessun timeout (impostazione predefinita)

Opzioni varie
  -l, --logfile Specifica il file in cui registrare gli errori quando viene rimosso.
  -n, --nodetach Non si stacca dal terminale di controllo. Senza
                        questa opzione, xsel si biforcherà per diventare uno sfondo
                        elaborare in modalità di input, scambio e mantenimento.

  -h, --help Visualizza questa guida ed esce
  -v, --verbose Stampa messaggi informativi
  --version Visualizza le informazioni sulla versione ed esce

Si prega di segnalare i bug a <conrad@vergenet.net>.

In breve, dovresti provare xclip -i/ xclip -oo xclip -i -sel clip/ xclip -o -sel clipo xsel -i/ xsel -oo xsel -i -b/ xsel -o -b, a seconda di cosa vuoi.


4
Per aggiungere a @ephemient 's messaggio: Per poter utilizzare xclip & Xsel con un host remoto, è possibile utilizzare l'inoltro X11 in questo modo: ssh -C -X user@remote-host. Se l'esecuzione di xclip sul lato remoto non sembra funzionare, assicurarsi che X11Forwarding yessia impostato nel /etc/ssh/sshd_configfile remoto . Assicurarsi inoltre che xauthsia installato sul lato remoto. Per una macchina senza testa, è possibile installare xauthe xvfb.
TrinitronX

Ecco una descrizione con dettagli extra oltre a associazioni di tasti vim.
Tim Bunce,

1
@TrinitronX oh wow - sbattere la testa contro un muro, grazie per la xvfbmenzione. Stavo eseguendo un server senza testa, quindi X11 non doveva essere in esecuzione!
Cam

5

Questa è la mia soluzione basata su SSH reverse tunnel, netcat e xclip.

Per prima cosa crea lo script (es. Clipboard-daemon.sh) sulla tua workstation:

#!/bin/bash
HOST=127.0.0.1
PORT=3333

NUM=`netstat -tlpn 2>/dev/null | grep -c " ${HOST}:${PORT} "`
if [ $NUM -gt 0 ]; then
    exit
fi

while [ true ]; do
    nc -l ${HOST} ${PORT} | xclip -selection clipboard
done

e avviarlo in background.

./clipboard-daemon.sh&

Inizierà l'output delle tubazioni nc su xclip e il processo di rigenerazione dopo aver ricevuto parte dei dati

Quindi avviare la connessione ssh all'host remoto:

ssh user@host -R127.0.0.1:3333:127.0.0.1:3333

Durante l'accesso sulla casella remota, provare questo:

echo "this is test" >/dev/tcp/127.0.0.1/3333

quindi prova a incollare sulla tua workstation

Naturalmente puoi scrivere uno script wrapper che avvia prima appunti-daemon.sh e poi la sessione ssh. Funziona così per me. Godere.


Questa soluzione è quella che ha funzionato meglio per me. non è troppo complicato e funziona correttamente.
Marcel Valdez Orozco,

La migliore soluzione secondo me. Non devi preoccuparti di consentire una connessione SSH inversa che ha implicazioni di sicurezza e il loop infinito è un bel tocco.
R. Taukulis,

4

Non un one-liner, ma non richiede ssh extra .

  • installare netcatse necessario
  • utilizzare termbin : cat ~/some_file.txt | nc termbin.com 9999. Ciò copierà l'output sul termbinsito Web e stamperà l'URL sull'output.
  • visita quell'URL dal tuo computer, ottieni l'output

Naturalmente, non utilizzarlo per contenuti sensibili.


Wow, questa è una soluzione molto creativa.
Sridhar Sarnobat,

3

Questa risposta si sviluppa sia sulla risposta scelta aggiungendo più sicurezza.

Tale risposta ha discusso la forma generale

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

Dove la sicurezza può mancare è nei sshpermessi permettendo <user B>su host B>a sshin host Aed eseguire qualsiasi comando.

Certo BcheA accesso può già essere recintato da una sshchiave e potrebbe anche avere una password. Ma un altro livello di sicurezza può limitare l'ambito dei comandi consentiti che Bpossono essere eseguiti A, ad esempio in modo che rm -rf /non possano essere chiamati. (Questo è particolarmente importante quando la sshchiave non ha una password.)

Fortunatamente, sshha una funzione integrata chiamata restrizione di comando o comando forzato . Vedi ssh.com o questa domanda serverfault.com .

La soluzione seguente mostra la soluzione di modulo generale insieme alla ssh restrizione di comando applicata.

Esempio Soluzione con restrizione di comando aggiunta

Questa soluzione di sicurezza avanzata segue il modulo generale: la chiamata dal ssh sessione in poi host-Bè semplicemente:

cat <file> | ssh <user-A>@<host A> to_clipboard

Il resto di questo mostra la configurazione per farlo funzionare.

Installazione di restrizione del comando ssh

Supponiamo che l'account utente su BISuser-B , e B è una chiave SSH id-clip, che è stato creato nel modo consueto ( ssh-keygen).

Quindi dentro user-A directory ssh c'è un file

/home/user-A/.ssh/authorized_keys

che riconosce la chiave id-clip e consente la sshconnessione.

Di solito il contenuto di ogni riga authorized_keys è esattamente la chiave pubblica autorizzata, ad esempio il contenuto di id-clip.pub.

Tuttavia, per imporre la restrizione del comando che il contenuto della chiave pubblica è anteposto (sulla stessa riga) dal comando da eseguire.
Nel nostro caso:

command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>

Il comando designato "/home/user-A/.ssh/allowed-commands.sh id-clip", e solo quel comando designato, viene eseguito ogni volta che id-clipviene usata la chiave per iniziare una sshconnessione host-A- indipendentemente da quale comando sia scrittossh riga di comando .

Il comando indica un file di script allowed-commands.she il contenuto di tale file di script è

#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

Id=${1}

case "$SSH_ORIGINAL_COMMAND" in
    "to-clipboard")
          notify-send "ssh to-clipboard, from ${Id}"
        cat | xsel --display :0 -i -b
          ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

La chiamata originale alla sshmacchinaB era

... | ssh <user-A>@<host A> to_clipboard

La stringa to-clipboardviene passata allowed-commands.shdalla variabile d'ambiente SSH_ORIGINAL_COMMAND. Inoltre, abbiamo passato il nome della chiave,id-clip , dalla riga in authorized_keyscui si accede solo daid-clip .

La linea

          notify-send "ssh to-clipboard, from ${Id}"

è solo una finestra di messaggio popup per informarti che gli appunti vengono scritti: probabilmente è anche una buona funzionalità di sicurezza. (notify-send funziona su Ubuntu 18.04, forse non altri).

In linea

cat | xsel --display :0 -i -b

il parametro --display :0è necessario perché il processo non ha il proprio display X con gli Appunti, quindi deve essere specificato esplicitamente. Questo valore :0funziona su Ubuntu 18.04 con il server Windows Wayland. In altre configurazioni potrebbe non funzionare. Per un server X standard questa risposta potrebbe essere d'aiuto.

host-A /etc/ssh/sshd_config parametri

Infine, alcuni parametri /etc/ssh/sshd_configsull'host Ache dovrebbero essere impostati per garantire l'autorizzazione alla connessione e l'autorizzazione per usare ssh-key solo senza password:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Per rendere il sshdserver rileggere la configurazione

sudo systemctl restart sshd.service

o

sudo service sshd.service restart

conclusione

È uno sforzo per configurarlo, ma altre funzioni oltre a quelle to-clipboardpossono essere costruite in parallelo nello stesso framework.


1
Xsel con remoteforwarding è stata l'unica risposta che ha funzionato per me su Ubuntu 18.04 con i3 localmente. Nessun inoltro X11 necessario.
Jay Stanley,


2

La soluzione più semplice di tutte, se sei su OS X usando Terminal e sei stato in giro su un server remoto e desideri prendere i risultati di un file di testo o di un registro o di un CSV, semplicemente:

1) Cmd-Kper cancellare l'uscita del terminale

2) cat <filename>per visualizzare il contenuto del file

3) Cmd-Sper salvare l'uscita del terminale

Dovrai rimuovere manualmente la prima riga e l'ultima riga del file, ma questo metodo è un po 'più semplice che basarsi su altri pacchetti da installare, "tunnel inversi" e provare ad avere un IP statico, ecc.


+1 per una tecnica utile che ho usato da solo, un po 'ti costringe a perdere la cronologia del tuo terminale e (come detto) il problema della prima / ultima riga è un po' complicato.
Alan Storm,

Concordato @AlanStorm
tw0000

Il problema più significativo di questo approccio è che salverà solo il numero di righe conservate dal buffer del terminale. Spesso non è un problema, ma se stai cercando di acquisire il contenuto di un file di registro, potresti esaurire la capacità,
Sridhar Sarnobat,

È vero @ Sridhar-Sarnobat, non è un'ottima soluzione in generale. Io uso solo scp!
tw0000,
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.