SCP ไปยังเซิร์ฟเวอร์ระยะไกลด้วย sudo


65

ฉันมีไฟล์บนเซิร์ฟเวอร์ A (ซึ่งอยู่หลัง NAT ดังนั้นจึงไม่สามารถกำหนดแอดเดรสได้โดยตรง) ไฟล์จะต้องคัดลอกไปยังเซิร์ฟเวอร์ B ในไดเรกทอรีที่ จำกัด ไว้ที่รูท ฉันมีบัญชีบนเซิร์ฟเวอร์ B พร้อมสิทธิ์ sudo ไวยากรณ์สำหรับคำสั่ง scp คืออะไร


คำถามที่คล้ายกัน: superuser.com/questions/87597/how-to-perform-scp-as-a-sudo-user
Kevin Panko

ฉันปิดคำถามเก่า ๆ ไปแล้วซ้ำซ้อนกับคำถามนี้เนื่องจากผู้ถามคำถามไม่ได้กลับมาเป็นเจ้าของคำถามนั้นอีก
ต้มตุ๋น quixote

ฉันมีคำตอบในการโพสต์อื่นว่าคุณสามารถกำหนด scp ทำ sudo ให้คุณโดยตรง สิ่งนี้คล้ายกับสิ่งที่ WinSCP ทำ
YoYo

คำตอบ:


58

ก่อนอื่นคุณต้องคัดลอกไฟล์ไปยังสถานที่ที่คุณมีสิทธิ์การเขียนโดยไม่ต้องใช้ sudo

scp yourfile serverb:

จากนั้นย้ายไฟล์โดยใช้ sudo

ssh serverb sudo mv yourfile /path/to/the/destination

หากคุณไม่มีสถานที่ที่สามารถเขียนได้ให้สร้าง dir ชั่วคราวพร้อมสิทธิ์เขียนสำหรับผู้ใช้ของคุณ

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp เป็นสถานที่ที่ดีสำหรับการเขียนไฟล์ชั่วคราวที่ (โดยปกติ) ผู้ใช้ทุกคนสามารถเข้าถึงได้
Doug Harris

3
@Doug: โปรดทราบว่า / tmp อาจเป็น RAM หรือจุดเชื่อมต่อ / และไม่จำเป็นต้องมีขนาดใหญ่พอที่จะโฮสต์ไฟล์ขนาดใหญ่
Ravachol

2
สิ่งที่คุณพยายามทำสำเร็จchmod 777มักเป็นวิธีที่ผิดที่จะทำ พิจารณาว่าจะเกิดอะไรขึ้นถ้ามีคนอื่นลงชื่อเข้าใช้และรู้ว่าคุณกำลังจะใช้รหัสนี้
tripleee

1
ssh sudoใช้งานไม่ได้สำหรับฉัน - บ่นว่า "ไม่มี tty ปัจจุบันและไม่ระบุโปรแกรม askpass"?
Ross Presser

1
@RossPresser ขออภัยสำหรับคำตอบที่ล่าช้า แต่คุณต้องตั้งค่า sudo โดยไม่ใช้รหัสผ่านserverbหรือคุณต้องssh serverbแยกต่างหากจากนั้นจึงเรียกใช้sudo ...หลังจากลงชื่อเข้าใช้
Johan

49

ด้วย SCP คุณต้องทำสองขั้นตอนอย่างไรก็ตามคุณสามารถทำได้ด้วย rsync ดังนี้:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

หมายเหตุ: สิ่งนี้ต้องการNOPASSWDการกำหนดค่า sudo หากคุณต้องป้อนรหัสผ่านสำหรับ sudo คุณจำเป็นต้องใช้วิธีสองขั้นตอนนี้

ในการคัดลอกไดเรกทอรีคุณต้องเพิ่ม-rพารามิเตอร์ และ-vสำหรับการส่งออก verbose


หากต้องการใช้วิธีการข้างต้นพร้อมข้อมูลประจำตัวคุณจะต้องเพิ่มลงใน~/.ssh/configไฟล์ของคุณเช่น

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
นี่เป็นวิธีที่ง่ายที่สุดที่จะทำ
Matt White

ข้อผิดพลาดในการแก้ไขโดยsudo: sorry, you must have a tty to run sudo -e "ssh -tt"
mj41

@ mj41 กับฉันได้รับ-e "ssh -tt" protocol version mismatch -- is your shell clean?คำแนะนำใด ๆ ในการแก้ไขปัญหานั้น
ขวาน

19

คุณสามารถใช้ ssh และ tar เพื่อแก้ไขสิ่งนี้:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

นี่เป็นการอัปเดตเวลา sudo ครั้งแรกของคุณ (ขอรหัสผ่านหากจำเป็นซึ่งต้องใช้ tty ( ssh -t)) จากนั้นใช้ sudo เพื่อสร้าง tarball จากระยะไกลและดึงข้อมูลในเครื่อง

"tar" บน RedHat 5 ต้องใช้ตัวเลือก "--preserve" เพื่อให้อยู่หลังคำสั่ง "xpsf -"


เพียงทราบ: ถ้าคุณได้รับtar: Invalid replacement stringการลบ-sในดูเหมือนว่าจะแก้ไขได้ (ไม่แน่ใจว่าสิ่งที่คุณต้องการsสำหรับต่อไป) ขอบคุณมาก; นี่มันเจ๋งมาก.
ซ้ำแบบประจำ

สิ่งนี้จะต้องtty_ticketsมีการปิดการใช้งานถูกต้อง?
Jacob Budin

@JacobBudin ใช่
blueyed

4

คุณสามารถใช้ sftp ด้วยคำสั่ง sudo ได้เช่น:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

นี่และวิธี rsync อาจเป็นวิธีที่ตรงที่สุดในการทำมันในขั้นตอนเดียว มันเป็นเรื่องที่โชคร้ายที่ภารกิจ scp ใน ant ไม่รองรับ คุณสามารถตั้งค่าให้ใช้ sftp แต่คุณไม่สามารถแก้ไขโปรแกรมย่อยระยะไกลได้ โปรดทราบว่าโปรแกรมย่อยจะแตกต่างกันไปตามประเภทของเซิร์ฟเวอร์ (โซลาริสอาจแตกต่างกัน)
YoYo

0

หากคุณต้องการพิมพ์รหัสผ่านสำหรับ sudo ทุกครั้งคุณสามารถบันทึกเป็นไฟล์:

echo "Enter password: "; read -s password; echo $password > password_file

จากนั้นส่งไปพร้อมกับไฟล์ต้นฉบับ

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

คุณสามารถใช้teeแทนspongeหากคุณไม่มีututilsมากขึ้น


0

ขั้นแรกคุณต้องคัดลอกไฟล์ไปยังสถานที่ที่คุณมีสิทธิ์การเขียนโดยไม่ต้องใช้ sudo คุณสามารถทำสองขั้นตอนต่อไปนี้

ขั้นตอนที่ 1: scp filename newserver

ขั้นตอนที่ 2: ssh newserver sudo mv filename /path/to/the/destination

สำหรับข้อมูลเพิ่มเติมอ่าน scp กวดวิชา


-1
current server $ sudo scp username@server:source/path/filename /tmp/

มันจะคัดลอกไฟล์เฉพาะจากแหล่งไปยัง / tmp / ในเซิร์ฟเวอร์ปัจจุบัน


มันจะดำเนินการ sudo ในพื้นที่ให้คุณไม่มีสิทธิ์ยกระดับจากระยะไกล
โยโย่

สิ่งนี้ไม่ทำงานตามที่ @Yoyo พูด
มณี

SCP จะไม่เชื่อมต่อเพราะมันจะอ่านกุญแจของราก
Pierre-Olivier Vares
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.