Làm thế nào để thực thi một lệnh từ xa và truyền vào tệp cục bộ làm đầu vào?


22

Có khả năng làm cái này không:

ssh user@socket command /path/to/file/on/local/machine

Điều đó có nghĩa là, tôi muốn thực thi một lệnh từ xa bằng cách sử dụng tệp cục bộ trong một bước, mà không sử dụng scptrước để sao chép tệp.


Có thể nếu máy tính từ xa có kết nối mạng của thư mục mẹ của tệp của máy cục bộ hoặc nếu bạn chuyển hướng tệp vào lệnh ssh
h3rrmiller

Câu trả lời:


23

Bạn đã bỏ lỡ chỉ một biểu tượng =)

ssh user@socket command < /path/to/file/on/local/machine

Tất nhiên! Tôi tự hỏi tại sao tôi không xem xét chuyển hướng đầu vào trên ssh?!
jsj

Điều gì sẽ xảy ra nếu lệnh từ xa chỉ có thể lấy một đối số tệp và không được đọc từ stdin?
iruvar

@ChandraRavoori trong trường hợp đó bạn cần sao chép nó scptrước đó.
vội vàng

4
@ChandraRavoori Bạn có thể thử cung cấp cho nó đối số tệp /dev/stdinhoặc -. Có thể hoặc không thể hoạt động ( /dev/stdinlà một tệp, nhưng tìm kiếm nó sẽ thất bại)
derobert

1
@derobert và vội vàng, chơi xung quanh với nó một chút và phát hiện ra một cách khó khăn để làm điều đó bằng cách sử dụng thay thế quy trình theo bash. Điều này vẫn phải tuân theo giới hạn tìm kiếm và có thể trở nên khó sử dụng với tất cả các trích dẫn bổ sung sẽ cần thiết. Ví dụ sau. kiểm tra mèo.file | người dùng ssh @ machine 'bash -c "wc -l <(cat -)"'
iruvar

4

Một cách hoạt động bất kể lệnh là làm cho tệp có sẵn trên máy từ xa thông qua hệ thống tệp từ xa. Vì bạn có kết nối SSH:

  1. Thiết lập một đường hầm SSH đảo ngược . Xem thêm SSH dễ dàng sao chép tệp vào hệ thống cục bộ
  2. Gắn cây thư mục của máy chứa tệp để chia sẻ trên máy từ xa bằng SSHFS . ( Ví dụ )

Dù sao cách này đòi hỏi các chuyển động bổ sung trước khi thực hiện lệnh.
vội vàng

@Gilles: Tôi nghĩ rằng tiêu đề ban đầu là sai lệch, và bạn hiểu câu hỏi của anh ấy dựa trên tiêu đề sai lệch. Theo như tôi có thể nói, anh nghĩ, anh không thực sự muốn hành động trên tệp cục bộ, mà chỉ chuyển nó vào làm đầu vào. . để làm cho nó phù hợp với cơ thể và với câu trả lời đã chọn.
iconoclast

@iconoclast Tôi không nhớ trạng thái tâm trí của mình khi tôi viết bài này, nhưng tôi đi theo câu trả lời này. Nó đòi hỏi một số thiết lập nhưng có lợi thế là khái quát hóa vượt quá yêu cầu trước mắt đối với các trường hợp khác khi không đủ để sao chép đầu vào. Tôi cũng đã đề cập đến việc chuyển hướng nếu người khác đã không làm điều đó. Câu hỏi tổng quát hơn đã được hỏi nhiều lần dưới các hình thức hơi khác nhau.
Gilles 'SO- ngừng trở nên xấu xa'

Được rồi, tôi đã hiểu lầm câu trả lời của bạn. Tôi đã không thử nó, nhưng suy ra rằng vì bạn đang thiết lập một đường hầm ngược (từ xa đến máy chủ cục bộ?), Bạn đã cho phép tệp cục bộ được sửa đổi bởi máy từ xa. đây không phải là trường hợp à?
iconoclast

@iconoclast Có, điều này cho phép máy từ xa sửa đổi tệp cục bộ (ngoài việc cho phép nó đọc nó, đó là những gì câu hỏi yêu cầu).
Gilles 'SO- ngừng trở thành ác quỷ'

1
# What if remote command can only take a file argument and not read from stdin? (1_CR)
ssh user@socket command < /path/to/file/on/local/machine
...
cat test.file | ssh user@machine 'bash -c "wc -l <(cat -)"'  # 1_CR

Thay thế cho bashquá trình thay thế <(cat -)hoặc < <(xargs -0 -n 1000 cat)(xem bên dưới), bạn chỉ có thể sử dụng xargscatchuyển nội dung của các tệp được chỉ định sang wc -l(dễ mang theo hơn).

# Assuming that test.file contains file paths each delimited by an ASCII NUL character \0
# and that we are to count all those lines in all those files (provided by test.file).

#find . -type f -print0 > test.file
# test with repeated line count of ~/.bash_history file
for n in {1..1000}; do printf '%s\000' "${HOME}/.bash_history"; done > test.file

# xargs & cat
ssh localhost 'export LC_ALL=C; xargs -0 -n 1000 cat | wc -l' <test.file

# Bash process substitution
cat test.file | ssh localhost 'bash -c "export LC_ALL=C; wc -l < <(xargs -0 -n 1000 cat)"'
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.