วิธีดำเนินการคำสั่งระยะไกลและส่งผ่านไฟล์โลคัลเป็นอินพุตได้อย่างไร


22

เป็นไปได้ที่จะทำสิ่งนี้:

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

กล่าวคือฉันต้องการรันคำสั่งระยะไกลโดยใช้ไฟล์โลคัลในขั้นตอนเดียวโดยไม่ต้องใช้scpเพื่อคัดลอกไฟล์ก่อน


เป็นไปได้ถ้าคอมพิวเตอร์ระยะไกลมีเครือข่ายเมานต์ของไดเรกทอรีหลักของไฟล์ของเครื่องท้องถิ่นหรือหากคุณเปลี่ยนเส้นทางไฟล์ไปยังคำสั่ง ssh
h3rrmiller

คำตอบ:


23

คุณพลาดเพียงสัญลักษณ์เดียว =)

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

แน่นอน! ฉันสงสัยว่าทำไมฉันจึงไม่พิจารณาการเปลี่ยนเส้นทางอินพุตไปที่ ssh!
jsj

เกิดอะไรขึ้นถ้าคำสั่งระยะไกลสามารถใช้อาร์กิวเมนต์ไฟล์เท่านั้นและไม่อ่านจาก stdin?
iruvar

@ChandraRavoori ในกรณีนี้คุณต้องคัดลอกมาscpก่อน
เร่ง

4
@ChandraRavoori คุณสามารถลองให้มันอาร์กิวเมนต์ไฟล์หรือ/dev/stdin -อาจหรืออาจจะไม่ทำงาน ( /dev/stdinเป็นไฟล์ แต่การค้นหามันจะล้มเหลว)
derobert

1
@derobert และเร่งด่วนเล่นไปรอบ ๆ กับมันเล็กน้อยและค้นพบวิธีแฮ็คที่จะทำมันโดยใช้การทดแทนกระบวนการภายใต้ทุบตี สิ่งนี้ยังคงอยู่ภายใต้ข้อ จำกัด การค้นหาและสามารถรับได้อย่างง่ายดายด้วยการอ้างเพิ่มเติมทั้งหมดที่จำเป็น ตัวอย่างดังต่อไปนี้ cat test.file | ผู้ใช้ ssh @ machine 'bash -c "wc -l <(cat -)"'
iruvar

4

วิธีหนึ่งที่ทำงานได้โดยไม่คำนึงถึงคำสั่งคือการทำให้ไฟล์พร้อมใช้งานบนเครื่องระยะไกลผ่านระบบไฟล์ระยะไกล เนื่องจากคุณมีการเชื่อมต่อ SSH:

  1. สร้างอุโมงค์ SSH ย้อนกลับ ดูเพิ่มเติมที่SSH คัดลอกไฟล์ไปยังระบบโลคัลได้อย่างง่ายดาย
  2. ติดต้นไม้ไดเรกทอรีเครื่องของคุณมีไฟล์ที่จะใช้ร่วมกันบนเครื่องระยะไกลกับSSHFS ( ตัวอย่าง )

ด้วยวิธีนี้ต้องมีการเคลื่อนไหวเพิ่มเติมก่อนที่จะดำเนินการคำสั่ง
เร่ง

@Gilles: ฉันคิดว่าชื่อดั้งเดิมทำให้เข้าใจผิดและคุณเข้าใจคำถามของเขาตามชื่อเรื่องที่ทำให้เข้าใจผิด เท่าที่ผมสามารถบอกได้คิดว่าเขาไม่ได้จริงต้องการทำหน้าที่ในไฟล์ท้องถิ่น แต่เพียงผ่านมันในเป็น input (แต่คำตอบของคุณน่าทึ่งถ้าฉันเข้าใจถูกต้อง! ฉันอาจจะถามคำถามที่คุณตอบเพียงเพื่อให้สถานที่ที่จะให้คำตอบที่คุณจะได้รับเครดิตที่เหมาะสม) ฉันได้แก้ไขชื่อคำถาม เพื่อให้สอดคล้องกับร่างกายและกับคำตอบที่เลือก
iconoclast

@iconoclast ฉันจำสภาพจิตใจของฉันไม่ได้เมื่อฉันเขียนสิ่งนี้ แต่ฉันตอบด้วยคำตอบนี้ มันต้องมีการตั้งค่าบางอย่าง แต่มีข้อได้เปรียบของการพูดเกินความต้องการทันทีไปยังกรณีอื่นที่ไม่เพียงพอที่จะคัดลอกอินพุต ฉันยังได้กล่าวถึงการเปลี่ยนเส้นทางหากคนอื่นไม่ได้ทำ คำถามทั่วไปที่ถูกถามมากขึ้นหลายครั้งในรูปแบบที่แตกต่างกันเล็กน้อย
Gilles 'หยุดความชั่วร้าย' ใน

โอเคฉันต้องเข้าใจผิดคำตอบของคุณ ฉันไม่ได้ลอง แต่อนุมานว่าตั้งแต่คุณสร้างอุโมงค์ย้อนกลับ (จากรีโมตโฮสต์ไปยังโลคัลโฮสต์?) คุณอนุญาตให้แก้ไขไฟล์โลคัลโดยเครื่องรีโมต นั่นไม่ใช่กรณีหรือไม่
iconoclast

@iconoclast ใช่สิ่งนี้อนุญาตให้เครื่องรีโมตแก้ไขไฟล์โลคัล (นอกเหนือจากการอนุญาตให้อ่านมันซึ่งเป็นสิ่งที่คำถามต้องการ)
Gilles 'หยุดความชั่วร้าย' ใน

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

เพื่อเป็นทางเลือกในการbashประมวลผลการทดแทน<(cat -)หรือ< <(xargs -0 -n 1000 cat)(ดูด้านล่าง) คุณสามารถใช้xargsและcatเพื่อไพพ์เนื้อหาของไฟล์ที่ระบุไปยังwc -l(ซึ่งพกพาได้มากกว่า)

# 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)"'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.