2016-06-01 10 views
2

in meinem Perl-Skript würde ich überBenutzername als Variable in SSH mit Perl

an eine Maschine angeschlossen werden möchte
my $result = `ssh [email protected]`; 

wo $ user der Benutzername auf der aktuellen Maschine ist. Dies funktioniert jedoch offensichtlich nicht, da Perl den gesamten String als eine Variable erkennt. Gibt es also eine andere Möglichkeit, eine Variable im Benutzernamen zu verwenden, wenn Sie eine Verbindung über SSH herstellen?

Ich habe gesehen, dass es ein SSH-Perl-Modul gibt, aber ich möchte vermeiden, zusätzliche Module zu verwenden, wenn es eine andere Lösung gibt.

Vielen Dank im Voraus!

+5

'verwenden Sie streng; Verwenden Sie Warnungen; ' – salva

+0

wie hilfreich es ist1 – Alex

Antwort

3

Flucht Sigill Luke:

my $result = `ssh $user\@machine`; 

Es ist nicht Array @machine, ist es nicht?

Backticks sind Quote-like Operators. (Ich empfehle generische qx{} Version über herkömmliche Backticks.) Es interpoliert (es sei denn, Sie verwenden) Inhalt, so interpoliert es @machine als Inhalt von machine Array. Es trennt Mitglieder durch einen Inhalt von $" Variable, die standardmäßig Leerzeichen ist. Wenn Sie keine @machine Variable definiert haben und nicht use strict; ist, wird sie als leere Zeichenfolge und ohne Warnung interpoliert, wenn nicht der Parameter use warnings; oder -W Parameter angegeben ist.

+0

Nein, das ist nur die Syntax, wie Sie eine Verbindung zu einem Remote-Computer in SSH herstellen. – Alex

+0

@Alex, >>> "Das funktioniert natürlich nicht, da Perl den gesamten String als eine Variable erkennt." - Mit '\' before @ (escape) wird Perl dazu gebracht, es nicht als Array zu sehen. – SilentMonk

+1

@Alex Ohne 'use strict;' backtick erweitert '@ machine' in den Inhalt des Arrays' @ machine', auch wenn es nicht existiert, daher ist result eine leere Zeichenkette. Wenn in @Machine etwas Inhalt wäre, würde es dort eingefügt werden. Probieren Sie 'perl -e'my @a = qw (foo bar baz); print \ 'echo @a \ ''' –

-1

Sie müssen "@" in der Zeichenfolge als ein Array und verwenden doppelte Anführungszeichen um variable Benutzer.

Versuchen:

my $result = `ssh "$user"\@machine`; 
+2

Die Zitate sind völlig unnötig. Sie dienen genau 0 Zweck. –

0

Versuchen: my $ result = ssh ${user}\@machine;

, wenn Sie mehrere Variablen, die Sie verwenden können {} zu sagen, dass sie anders sind wie: $ {user1} _ $ {user2}

+1

Das ist nur notwendig, wenn das Zeichen unmittelbar nach dem Variablennamen ein gültiges Variablenzeichen ist. '@' ist nirgendwo außer am Anfang einer Array-Variablen (oder Slice oder Array-Dereferenzierung usw.) gültig, so dass in diesem Fall kein 'user' in' {} 'eingebunden werden muss. Es wird nichts schaden, sicher, aber keine Notwendigkeit, das eigentliche Problem zu verwirren, das das '@' sein muss, das entkam. –

3

Perl erkennt die gesamte Zeichenfolge als eine Variable.

Nein, das ist nicht das Problem. Das Problem ist, dass zusätzlich $user als Variable analysiert wird und @machine auch als Variable analysiert wird.

Es ist einfach eine Frage der Escape-Sonderzeichen.

my $result = `ssh $user\@machine`; 

Wenn das Problem war wirklich, dass Sie das Ende einer Variablen zu kommunizieren benötigt, können Sie curlies verwenden.

my $count = 4; 
my $item = 'book'; 
print("$count $items\n");  # XXX 
print("$count ${item}s\n"); # 4 books 
Verwandte Themen