Ist es möglich, dass scp fehlschlägt, wenn Sie eine lokale Kopie erstellen?

7

Ist es möglich, einen scpFehler zu machen , wenn Sie eine lokale Kopie erstellen? Ich finde es ärgerlich, versehentlich Dateien mit Namen zu erstellen, wie 192.168.11.5ich sie eingeben 192.168.11.5:und damit auf den Remotecomputer kopieren wollte.

Jason Axelson
quelle

Antworten:

6

Nicht standardmäßig, aber wenn Sie etwas schnelles wollen, können Sie einfach einen Wrapper darum erstellen, indem Sie die ursprüngliche Binärdatei nach scp.orig verschieben und ein neues Shell-Skript erstellen, das die Eingabe übernimmt, prüft, ob die Eingabe ein: enthält, und es weitergibt , wenn nicht aufgefordert, fortzufahren?

Bearbeiten: Dieser Beitrag beantwortet meine Frage, also akzeptiere ich, aber ich wollte die Shell-Funktion hinzufügen, die ich geschrieben habe und die das Problem für mich löst:

# Simple wrapper around scp to avoid forgotten colon's
scp() {
    if [[ $@ == *:* ]]; then
        # Looks like a valid command so run it
        command scp "$@"
    else
        echo -n "Would you like to add a colon to the end of the function? [y/n] "
        read response
        if [ "$response" = "y" ]; then
            command scp "$@":
        else
            command scp "$@"
        fi
    fi
}
Gilles 'SO - hör auf böse zu sein'
quelle
@JasonAxelson Beachten Sie, dass Ihr Wrapper in einigen Fällen beschädigt wird, z. B. wenn das Argument einer Option enthält :oder wenn mehrere Quellen vorhanden sind. Außerdem benötigen Sie Anführungszeichen "$@", da sonst Ihr Skript mit einigen Dateinamen beschädigt wird (insbesondere, wenn Sie entfernte Platzhalter übergeben). Ich würde auch mehr Überprüfungen des letzten Arguments empfehlen, um nur ein :Element hinzuzufügen , das wie ein Hostname aussieht.
Gilles 'SO - hör auf böse zu sein'
1

Es gibt keine solche Option in scp. Sie können ein Wrapper-Skript schreiben, das die Argumente überprüft. Hier ist eine (ungetestet, direkt im Browser eingegeben). Es wird überprüft, ob das letzte Argument (das Ziel) ein enthält :oder ob alle vorherigen Nichtoptionsargumente (die Quellen) ein enthalten :.

#!/bin/sh
eval "target=\${$#}"
case $target in
  *:*) :;; # remote target
  *) # local target
    while getopts F:P:S:c:i:l:o:1246BCpqrv OPTLET; do :; done
    i=$OPTIND
    while [ $i -lt $# ]; do
      i=$((i+1))
      eval "source=\${$i}"
      case $source in
        *:*) :;; # remote source
        *)
          echo 1>&2 "Refusing to copy a local file to a local file with scp"
          exit 99;;
      esac
    done
esac
exec scp "$@"
Gilles 'SO - hör auf böse zu sein'
quelle