Bagaimana caranya sudo over sshfs?

35

Pada host lokal saya, alphasaya memiliki direktori fooyang dipetakan melalui sshfs menjadi host bravosebagai berikut:

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

Namun, pada host bravoada pengguna lain, delta, yang saya inginkan sudo /bin/su, sehingga saya dapat melakukan pekerjaan bravo:/home/delta. deltamungkin tidak dapat masuk melalui ssh; untuk alasan yang tidak bisa saya ubah, Anda hanya bisa sudo ke delta begitu Anda berada di mesin.

Biasanya aku ssh ke bravo, kemudian sudo ke delta, tapi aku bertanya-tanya apakah ada cara yang bisa aku lakukan ketika aku punya dir rumah charlie yang dipasang melalui ssh.

dirtside
sumber
2
Ini mungkin paling baik diselesaikan dengan izin file.
artifex

Jawaban:

36

Ini akan bervariasi tergantung pada OS server yang Anda hubungkan. Untuk centOS 5 Anda akan menambahkan opsi sshfs mount:

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

Untuk Ubuntu 9.10 (saya pikir, mungkin 9,04, tapi mungkin sama untuk keduanya) atau Debian yang akan Anda tambahkan:

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

Untuk menemukan jalur yang benar untuk sistem lain yang menjalankan openSSH dijalankan

sudo grep Subsystem /etc/ssh/sshd_config

dan cari lokasi biner sftp-server.

Anda mungkin perlu men-setup sudo dengan NOPASS: {path to sftp-server} atau membuat dengan ssh user@host sudo -vsehingga sudomemiliki timestamp yang diperbarui untuk notty. Dalam kasus saya, dua perintah saya adalah:

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"
Craisis
sumber
1
Terima kasih, ini 'trik' yang sangat rapi. Saya baru saja menambahkan "-u <some_other_user>" ke sudo untuk situasi saya
jor
1
Sangat bagus, bekerja dengan sempurna. Satu-satunya poin saya adalah bahwa ada / usr / bin / sudo dua kali dalam contoh, yang tampaknya tidak perlu.
xaralis
1
@Craisis Maaf untuk membuka postingan lama, tapi saya ingin ssh ke server CentOS 6.5 dengan pengguna dasar, tetapi me-mount folder yang hanya akses root. Apakah ini benar: 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 -vtidak membuat sudo saya senang - ia ingin tty sebelum membiarkan saya sudo. Pikiran?
w00t
1
@eggo @Sebi @calandoa @xaralis Apakah perintah ini juga berfungsi jika saya ingin sudo sebagai root di debian 9? Karena jika saya menggunakan: 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"itu tidak bekerja: \ - itu hanya mengatakan "host jarak jauh telah terputus"
user3450548
3

Anda dapat menggunakan bindfs + sshfs untuk mengakses file pengguna lain (bahkan root).

Pertama Anda me-mount 'root' Anda atau direktori lain di bawah pengguna Anda dengan uid yang dipetakan ulang.

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

dan kemudian cukup sshfs ke direktori.

sshfs USER@SERVER:tmproot TARGET

Tetapi untuk keamanan, lebih baik tidak memetakan seluruh root /tetapi hanya sebagian yang Anda butuhkan. Sebagai contoh: Anda dapat menggunakan metode ini untuk me-mount direktori pengguna lain ke Anda, misalnya file dari / var / www ke ~ / www dan remap root ke pengguna Anda sehingga Anda akan memiliki akses penuh ke sana.

Jika Anda memerlukan akses untuk mempertahankan uid atau memiliki akses ke banyak pengguna, maka saya akan membuat pengguna baru misalnya "rootfs" dengan uid = 0 dan / bin / false dan melakukan sshfs normal.

kolorafa
sumber
0

Anda mungkin mencoba (tapi saya rasa itu tidak akan berhasil):

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

Saya tidak mengerti sshfs dengan sangat baik, jadi Anda mungkin bisa membuat sesuatu seperti itu berfungsi, tetapi saya tidak bisa mengatakan caranya, dan saya akan sedikit terkejut.

Kemungkinan lain adalah dengan meletakkan perintah 'sudo / bin / su bravo' di ~ / .ssh / rc, tetapi itu akan memengaruhi semua pemasangan fs Anda (dengan asumsi itu berhasil, yang saya juga ragu) serta penggunaan ssh seperti biasa .

Maaf karena menjadi debbie downer.

Slartibartfast
sumber
0

Dengan deduksi, saya pikir ini tidak mungkin dicapai dalam perintah sederhana.

Ini karena sshfs memanggil ssh tanpa melewati perintah apa pun tetapi, sebaliknya, menggunakan SFTP yang merupakan subsistem dari SSH.

Dari manual sshfs :

Pada komputer jarak jauh subsistem SFTP dari SSH digunakan.

Plus , mengubah pengguna saat ini (atau 'su' atau 'sudo') bukan bagian dari protokol SFTP, meskipun ini sepertinya fitur yang sangat sering diminta.

Weboide
sumber
ini bukan tidak mungkin. Solusi Craisis bekerja.
Jayen
Tentu saja ya, karena dia menimpa perintah yang memulai subsistem dan menambahkan sudo. Temuan bagus tetapi Anda harus mengatur sudo tanpa kata sandi (atau menggunakan stempel waktu), yang dapat mengurangi keamanan. tapi saya tidak akan berdebat karena OP benar-benar ingin melakukan itu.
Weboide
0

Mungkin, cara terbaik adalah melalui izin file, seperti yang diusulkan @artifex.

Seperti @Weboide katakan, tidak mungkin melalui sshfs.

Tapi saya kira Anda bisa membuat skrip sederhana, sebut saja itu sudosshyang akan membawa Anda $PWD, konversikan ke /home/delta/dan jalankan perintah melalui sshdan sudopada mesin jarak jauh.

Sesuatu seperti ini:

#!/usr/bin/env bash

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

Setelah itu Anda bisa mengeksekusi sudossh commanddan ingat untuk menggunakan jalur relatif.

Jika Anda menggunakan ssh-agent, Anda hanya perlu memasukkan sudokata sandi Anda .

chmeee
sumber
0

Solusi saya adalah ngeri jelek (terima kasih kepada beberapa lapisan string melarikan diri), tetapi itu akan membaca jalan sftp-serverdari /etc/ssh/sshd_configdan menjalankannya sudo. Sekarang bagaimana jika sshd_configtidak berada di bawah /etc/ssh? Mungkin mencari di dalam sshbiner dengan stringsdan grep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
André von Kugland
sumber