วิธีการเขียนไฟล์จากระยะไกลโดยใช้ SSH


41

ฉันสามารถคัดลอกไฟล์ไปยังเครื่อง Linux ระยะไกลได้โดยไม่มีปัญหา

scp file user@host: /pathtowrite_file

อย่างไรก็ตามฉันมีปัญหาในการเขียนไฟล์จากเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง นี่คือสิ่งที่ฉันพยายาม:

echo 'Some Text' > /remotefile.txt | ssh user@remotehost

สิ่งที่ฉันได้รับคือ

stdin: ไม่ใช่ tty

ไฟล์ในเครื่องระยะไกลไม่ได้สะท้อนถึงข้อความที่ส่งว่า 'ข้อความบางข้อความ'

คำตอบ:


70

คุณสามารถใช้คำสั่ง "cat" เพื่อสร้างไฟล์ระยะไกล

echo 'Some Text' | ssh user@remotehost -T "cat > /remotefile.txt"

-Tปิดใช้งานการจัดสรรเทอร์มินัลหลอกและห้ามไม่ให้คุณรับข้อความ

Pseudo-terminal จะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล


แต่ฉันต้องการเขียนไปยังไฟล์ที่มีอยู่ในเครื่องระยะไกล
ซุฟฟา

2
"cat> /remotefile.txt" ทำงานบนเครื่องระยะไกลและหากคุณต้องการผนวกไฟล์ที่มีอยู่ให้คุณแทนที่ ">" โดย ">>"
Aragorn

@suffa: คุณพยายามต่อท้ายไฟล์ที่มีอยู่หรือไม่? หรือคุณต้องการเขียนทับไฟล์ แต่ล้มเหลวหากยังไม่มีไฟล์อยู่? หรืออะไร?
David Schwartz

@ David Schwartz - เช่นกัน ฉันต้องการเขียนทับและล้มเหลวหากไม่ออก ... แต่ฉันจะต่อท้ายที่จุดนี้
ซุฟฟา

`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` ก็ใช้ได้สำหรับฉันเช่นกัน
เพียงเซท

10

สั้นกว่าคำตอบอื่นเล็กน้อย:

ssh user@remotehost "echo Some Text > /remotefile.txt"

3
ทรู; สิ่งนี้จะใช้งานได้ - หากการเขียนข้อความหนึ่งบรรทัดไปยังไฟล์ระยะไกลเป็นสิ่งที่ OP ต้องการทำจริงๆ คำสั่งในคำถามดูเหมือนว่าการทดสอบพิสูจน์แนวคิด คำถามกล่าวว่า "การเขียนไปยังไฟล์จากเครื่อง Linux เครื่องหนึ่งไปยังเครื่องอื่น" หากผู้ใช้ต้องการเรียกใช้คำสั่งโดยพลการ (หรือลำดับของคำสั่ง) - และไม่ใช่แค่แบบechoโลคัลคำตอบของคุณจะไม่ช่วยและคำตอบที่ได้รับการยอมรับจะเป็นวิธีการ
สกอตต์

@Scott หลายคำสั่งสามารถทำได้โดยใช้วิธีการนี้ ชอบมากที่สุดของ Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r

เยี่ยมเพื่อนขอบคุณสำหรับ downvote ฉันเดาว่าง่ายกว่าการพูดถึงประเด็นของฉันจริงหรือ PS ความคิดเห็นของคุณด้านบนไม่สมเหตุสมผล
g33kz0r

1
ตกลงคุณต้องการคำวิจารณ์เพิ่มเติมหรือไม่ (1) ทำไมคุณถึงพูดบนโลกนี้ssh localhost? นั่นเป็นเพียงการทำให้น้ำขุ่นไม่ทำให้ชัดเจนขึ้น (2) โดยไม่แสดงการเปลี่ยนเส้นทางในตัวอย่างที่แก้ไขของคุณคุณทำให้เกิดคำถามว่าคุณรู้วิธีจัดกลุ่มคำสั่งและส่งเอาต์พุตทั้งหมดไปยังไฟล์เดียวหรือไม่ … (ต่อ)
สกอตต์

1
(ต่อ) ... (3) คุณพลาดจุดของฉันไปแล้วโดยเน้นไปที่วลี“ ข้อความบรรทัดเดียว” จุดของฉันคือการที่ OP อาจต้องการที่จะทำบางสิ่งบางอย่างที่มีความซับซ้อนมากขึ้นว่าการเขียนข้อความเป็นที่รู้จักกันไปยังแฟ้มระยะไกล - เขาอาจต้องการที่จะทำงานในท้องถิ่นคำสั่งและส่งออกไปยังไฟล์ระยะไกลเช่นเดียวกับใน หากคุณสามารถปรับคำตอบของคุณให้ตรงกับกรณีทั่วไปโปรดทำเช่นนั้น command (localhost) > file (remotehost)
Scott

6

เป็นไปได้ที่จะใช้ddเพื่อต่อท้ายไฟล์ อาจจะค่อนข้างคลุมเครือ แต่มีประโยชน์หากไม่สามารถเปลี่ยนเส้นทางเอาต์พุตบนรีโมตโฮสต์

cat ~/.ssh/id_rsa.pub | ssh user@remote.host 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'

ตัวอย่างนี้ต่อท้ายกุญแจสาธารณะของคุณไปยังไฟล์ authorized_keys บนรีโมตโฮสต์

(ที่มา: http://www.rsync.net/resources/howto/ssh_keys.html )


3

การดำเนินการนี้จะนำเนื้อหาของคลิปบอร์ดของคุณบน Mac และต่อท้ายไฟล์จากระยะไกล:

pbpaste | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

สิ่งนี้อนุญาตให้คุณเขียน (ต่อท้าย) ที่ส่วนท้ายของไฟล์บนรีโมตโฮสต์:

echo "Append string to file" | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

1

หากจะต้องมีการใช้งานหลายครั้งอาจจะง่ายกว่าการใช้รหัสนี้ ด้วยเครื่องมือ "sshpass" ssh จะไม่ขอให้คุณใส่รหัสผ่านสำหรับการเรียกใช้สคริปต์แต่ละครั้ง (เว้นแต่คุณจะต้องเก็บเป็นความลับจากนั้นดีกว่าไม่ใช้)

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ sshpass: https://stackoverflow.com/questions/12202587/automatically-enter-ssh-password-with-script

#!/bin/bash

SCRIPT="echo 'nameserver 8.8.8.8' > /etc/resolv.conf"        

if [ "$#" -ne 1 ]; then
        echo "Wrong number of arguments. usage: prog dest_machine"
else
        sshpass -p "root" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
fi

ใช้งานง่ายกว่าอะไร นี่เป็นคำตอบเดียวกับคำตอบของ g33kz0r (จากเกือบสองปีที่แล้ว) รวมทั้งระฆังและนกหวีดที่ไม่ชัดเจนเป็นพิเศษ อย่างน้อยก็อธิบายสิ่งที่คุณเพิ่มเข้าไป
สกอตต์

หากสคริปต์ของคุณถูกเรียกใช้โดยมีอาร์กิวเมนต์มากเกินไปข้อความแสดงข้อผิดพลาดจะแจ้งว่ามีอาร์กิวเมนต์น้อยเกินไป
G-Man กล่าวว่า 'Reinstate Monica'

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

1

คุณสามารถใช้viหรือnanoหรือpicoแก้ไข:

# Just replace "vi" with "nano" or "pico" if you want to use them.
vi remotefile.txt

อย่างไรก็ตามคุณจะต้องเขียนSome Textลงในตัวแก้ไขด้วยตัวเองดังนั้นกระบวนการนี้จึงเข้ากันไม่ได้กับแบทช์


-1

สร้างสคริปต์ดังต่อไปนี้:

# !/bin/bash

read -p "Enter target server IP : " server
echo "Enter root password for $server : " ; read -s password

yum install sshpass -y

sshpass -p "$password" ssh -o strictHostKeyChecking=no root@$server echo "your text goes here" >> /remotefile.txt

ฉันเห็น downvote ส่วนใหญ่มาจากคนที่ไม่ใช้คำสั่งใหม่yumโดยไม่มีเหตุผลที่ดีมาก คำตอบนี้แสดงว่า แต่ทำไม (การยกเลิก downvote ในขณะนี้ - ฉันหวังว่าคุณจะแก้ไขสิ่งนี้เพื่อให้มีบริบทมากขึ้น)
SDsolar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.