Có thể làm cho scp thất bại khi bạn làm một bản sao địa phương?


7

Có thể làm cho scpthất bại khi bạn làm một bản sao địa phương? Tôi cảm thấy khó chịu khi vô tình tạo các tệp có tên như 192.168.11.5khi tôi định nhập 192.168.11.5:và từ đó sao chép tệp vào máy tính từ xa.

Câu trả lời:


6

Không phải theo mặc định, nhưng nếu bạn muốn một cái gì đó nhanh chóng, bạn có thể chỉ cần tạo một trình bao bọc xung quanh nó một cái gì đó như di chuyển nhị phân ban đầu sang scp.orig và có một tập lệnh shell mới lấy đầu vào, kiểm tra xem có: trong đầu vào và chuyển nó , nếu không nhắc tiếp tục?

Chỉnh sửa: Bài đăng này trả lời câu hỏi của tôi vì vậy tôi chấp nhận nhưng tôi muốn thêm chức năng shell mà tôi đã viết để giải quyết vấn đề cho tôi:

# 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
}

@JasonAxelson Hãy coi chừng trình bao bọc của bạn sẽ bị hỏng trong một số trường hợp, ví dụ: nếu đối số của tùy chọn chứa :hoặc nếu có nhiều nguồn. Ngoài ra, bạn cần trích dẫn "$@", nếu không tập lệnh của bạn sẽ bị hỏng với một số tên tệp (đặc biệt nếu bạn chuyển các ký tự đại diện từ xa). Tôi cũng khuyên bạn nên kiểm tra thêm về đối số cuối cùng, để chỉ thêm một :vào một cái gì đó trông giống như tên máy chủ.
Gilles 'SO- ngừng trở nên xấu xa'

1

Không có lựa chọn như vậy trong scp. Bạn có thể viết một kịch bản lệnh bao bọc để kiểm tra các đối số. Đây là một (chưa được kiểm tra, gõ trực tiếp trong trình duyệt). Nó xác minh rằng đối số cuối cùng (đích) chứa a :hoặc tất cả các đối số không phải tùy chọn trước đó (các nguồn) chứa a :.

#!/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 "$@"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.