ฉันจะ sudo ผ่าน sshfs ได้อย่างไร


35

ในโฮสต์ท้องถิ่นของalphaฉันฉันมีไดเรกทอรีfooที่ถูกแมปผ่าน sshfs ไปยังโฮสต์bravoดังนี้

$ sshfs charlie@bravo:/home/charlie ~/foo

อย่างไรก็ตามในโฮสต์bravoมีผู้ใช้อื่นเดลต้าที่ฉันต้องการsudo /bin/suเป็นเพื่อให้ฉันสามารถทำงานbravo:/home/deltaได้ deltaอาจไม่ได้เข้าสู่ระบบผ่านทาง ssh; ด้วยเหตุผลที่ฉันไม่สามารถเปลี่ยนแปลงได้คุณสามารถ sudo ผ่านไปยังเดลต้าเมื่อคุณอยู่บนเครื่องเท่านั้น

โดยปกติแล้วฉันจะ ssh bravoแล้ว sudo ถึงเดลต้า แต่ฉันสงสัยว่ามีวิธีใดที่ฉันสามารถทำได้เมื่อฉันมีบ้านของ charlie dir ติดตั้งผ่าน ssh


2
นี่อาจแก้ไขได้ดีที่สุดด้วยการอนุญาตไฟล์
artifex

คำตอบ:


36

สิ่งนี้จะแตกต่างกันไปตามระบบปฏิบัติการของเซิร์ฟเวอร์ที่คุณกำลังเชื่อมต่อ สำหรับ centOS 5 คุณควรเพิ่มตัวเลือกการเมานต์ sshfs:

-o sftp_server="/usr/bin/sudo /usr/libexec/openssh/sftp-server"

สำหรับ Ubuntu 9.10 (ฉันคิดว่าอาจเป็น 9.04 แต่อาจเหมือนกันทั้งคู่) หรือ Debian ที่คุณจะเพิ่ม:

-o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server".

เพื่อหาพา ธ ที่ถูกต้องสำหรับระบบอื่น ๆ ที่รัน openSSH

sudo grep Subsystem /etc/ssh/sshd_config

และค้นหาตำแหน่งของไบนารี sftp-server

คุณอาจต้อง sudo ติดตั้งกับ NOPASS: {เส้นทางไป SFTP เซิร์ฟเวอร์} หรือ prevalidate ด้วยssh user@host sudo -vเพื่อให้มีการประทับเวลาปรับปรุงสำหรับsudo nottyในกรณีของฉันคำสั่งสองคำของฉันคือ:

ssh login_user@host sudo -v
sshfs login_user@host:remote_path local_path -o sftp_server="/usr/bin/sudo -u as_user /usr/lib/ssh/sftp-server"

1
ขอบคุณนี่เป็น 'เคล็ดลับ' ที่เรียบร้อยมาก ฉันเพิ่งเพิ่ม "-u <some_other_user>" ลงใน sudo สำหรับสถานการณ์ของฉัน
jor

1
ดีมากทำงานได้อย่างไร้ที่ติ จุดเดียวของฉันคือมี / usr / bin / sudo สองครั้งในตัวอย่างซึ่งดูเหมือนไม่จำเป็น
xaralis

1
@Craisis ขออภัยที่จะนำโพสต์เก่า แต่ฉันต้องการที่จะ ssh ในเซิร์ฟเวอร์ CentOS 6.5 กับผู้ใช้ขั้นพื้นฐาน แต่ติดตั้งโฟลเดอร์ที่เข้าถึงรากเท่านั้น นี้จะเป็นที่ถูกต้อง: sshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server"?
Don Rhummy

1
ssh host sudo -vไม่ทำให้ sudo ของฉันมีความสุข - มันต้องการ tty ก่อนที่มันจะทำให้ฉัน sudo คิด?
w00t

1
@eggo @Sebi @calandoa @xaralis คำสั่งนี้ทำงานได้ไหมถ้าฉันต้องการ sudo เป็น root ใน debian 9 เพราะถ้าฉันใช้: ssh -t myuser@host sudo -v sshfs myuser@host:remote_path local_path -o sftp_server="/usr/bin/sudo -u root /usr/lib/openssh/sftp-server"มันใช้งาน ไม่ได้: \ - แค่บอกว่า "รีโมตโฮสต์ถูกตัดการเชื่อมต่อ"
user3450548

3

คุณสามารถใช้ bindfs + sshfs เพื่อเข้าถึงไฟล์ผู้ใช้อื่น ๆ (แม้แต่รูท)

ก่อนอื่นคุณเมาท์ 'root' หรือไดเรกทอรีอื่น ๆ ภายใต้ผู้ใช้ของคุณด้วย uid ที่แมปใหม่

ssh -t USER@SERVER "mkdir ~/tmproot; sudo bindfs --map=root/USER / ~/tmproot"

จากนั้นเพียงแค่ sshfs ลงในไดเรกทอรี

sshfs USER@SERVER:tmproot TARGET

แต่เพื่อความปลอดภัยจะดีกว่าถ้าไม่จับคู่รูททั้งหมด/แต่เพียงบางส่วนที่คุณต้องการ ตัวอย่างเช่น: คุณสามารถใช้วิธีนี้เพื่อติดตั้งไดเรกทอรีผู้ใช้อื่น ๆ ของคุณเช่นไฟล์จาก / var / www เป็น ~ / www และทำการแมปรูทเข้ากับผู้ใช้ของคุณดังนั้นคุณจะสามารถเข้าถึงได้อย่างเต็มที่

หากคุณต้องการเข้าถึงเพื่อรักษา uid หรือมีการเข้าถึงผู้ใช้หลายคนจากนั้นฉันจะสร้างผู้ใช้ใหม่เช่น "rootfs" กับ uid = 0 และ / bin / false และทำ sshfs ปกติ


0

คุณอาจลอง (แต่ฉันไม่คิดว่ามันจะใช้งานได้):

sshfs -o ssh_command='ssh sudo /bin/su bravo' charlie@bravo:/home/charlie ~/foo

ฉันไม่เข้าใจ sshfs ดีมากดังนั้นคุณอาจจะได้อะไรแบบนั้นไปทำงาน แต่ฉันไม่สามารถพูดได้ว่าอย่างไรและฉันจะแปลกใจเล็กน้อย

ความเป็นไปได้อีกอย่างก็คือการใส่คำสั่ง 'sudo / bin / su bravo' ใน ~ / .ssh / rc แต่นั่นจะส่งผลต่อการเมานท์ fs ทั้งหมดของคุณ (สมมติว่ามันใช้งานได้ซึ่งฉันก็สงสัย) .

ขออภัยที่เป็นคนบ้าบั๊ก


0

โดยการหักเงินฉันคิดว่านี่เป็นไปไม่ได้ที่จะประสบความสำเร็จด้วยคำสั่งง่ายๆ

นี่เป็นเพราะsshfs เรียก ssh โดยไม่ผ่านคำสั่งใด ๆ แต่ใช้ SFTP ซึ่งเป็นระบบย่อยของ SSH แทน

จากmansh sshfs :

บนคอมพิวเตอร์ระยะไกลใช้ระบบย่อย SFTP ของ SSH

นอกจากนี้การเปลี่ยนผู้ใช้ปัจจุบัน (หรือ 'su' หรือ 'sudo') ไม่ได้เป็นส่วนหนึ่งของโพรโทคอล SFTP แม้ว่านี่จะดูเหมือนว่าเป็นคุณลักษณะที่ขอบ่อยมาก


นี่เป็นไปไม่ได้ โซลูชันของ Craisis ใช้ได้ผล
Jayen

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

0

อาจเป็นวิธีที่ดีที่สุดคือผ่านการอนุญาตไฟล์ตามที่ @artifex เสนอ

ตามที่ @ Weboide กล่าวว่าเป็นไปไม่ได้ที่จะใช้ sshfs

แต่ฉันคิดว่าคุณสามารถสร้างสคริปต์อย่างง่ายลองเรียกมันsudosshว่าจะใช้ของคุณ$PWDแปลงเป็น/home/delta/และเรียกใช้คำสั่งผ่านsshและsudoบนเครื่องระยะไกล

บางสิ่งเช่นนี้

#!/usr/bin/env bash

ssh -t charlie@bravo "cd `pwd | sed 's/user\/foo/delta/'`; sudo -u delta $*"

หลังจากนั้นคุณสามารถดำเนินการsudossh commandและอย่าลืมใช้เส้นทางสัมพันธ์

หากคุณใช้ ssh-agent คุณจะต้องป้อนsudoรหัสผ่านของคุณ


0

วิธีการแก้ปัญหาของฉันคือcringinglyน่าเกลียด (ขอบคุณไปไม่กี่ชั้นของสตริงหลบหนี) แต่มันจะอ่านเส้นทางไปsftp-serverจากและดำเนินการผ่าน/etc/ssh/sshd_config sudoตอนนี้สิ่งที่ถ้าsshd_configไม่ได้อยู่ภายใต้/etc/ssh? อาจค้นหาภายในsshไบนารีด้วยstringsและgrep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.