Làm thế nào để tôi sudo trên sshfs?


35

Trên máy chủ lưu trữ cục bộ của tôi, alphatôi có một thư mục foođược ánh xạ qua sshfs để lưu trữ bravonhư sau:

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

Tuy nhiên, trên máy chủ lưu trữ bravocó một người dùng khác, delta, mà tôi muốn sudo /bin/su, để tôi có thể thực hiện công việc bravo:/home/delta. deltacó thể không được đăng nhập qua ssh; vì những lý do mà tôi không thể thay đổi, bạn chỉ có thể sudo qua delta khi bạn đang ở trên máy.

Thông thường tôi sẽ ssh vào bravo, sau đó sudo đến delta, nhưng tôi tự hỏi liệu có cách nào tôi có thể làm điều đó khi tôi có thư mục nhà của charlie được gắn qua ssh.


2
Điều này có thể được giải quyết tốt nhất với quyền truy cập tập tin.
artifex

Câu trả lời:


36

Điều này sẽ thay đổi tùy thuộc vào hệ điều hành của máy chủ mà bạn đang kết nối. Đối với centOS 5, bạn sẽ thêm vào các tùy chọn gắn kết sshfs:

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

Đối với Ubuntu 9.10 (tôi nghĩ, có thể là 9.04, nhưng có lẽ giống nhau cho cả hai) hoặc Debian bạn sẽ thêm:

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

Để tìm đường dẫn chính xác cho các hệ thống khác đang chạy openSSH

sudo grep Subsystem /etc/ssh/sshd_config

và tìm vị trí của nhị phân sftp-server.

Bạn có thể cần phải thiết lập sudo với NOPASS: {path to sftp-server} hoặc thịnh hành ssh user@host sudo -vđể sudocó dấu thời gian cập nhật cho notty. Trong trường hợp của tôi, hai lệnh của tôi là:

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
Cảm ơn, đây là một 'mẹo' rất gọn gàng. Tôi vừa thêm "-u <some_other_user>" vào sudo cho tình huống của tôi
jor

1
Rất tốt, làm việc hoàn hảo. Điểm duy nhất của tôi là có / usr / bin / sudo hai lần trong ví dụ, điều này có vẻ không cần thiết.
xaralis

1
@Craisis Xin lỗi để hiển thị bài đăng cũ, nhưng tôi muốn ssh vào máy chủ CentOS 6.5 với người dùng cơ bản, nhưng chỉ gắn một thư mục truy cập root. Điều này có đúng sshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server"không?
Don Rhummy

1
ssh host sudo -vkhông làm cho sudo của tôi hạnh phúc - nó muốn một tty trước khi nó cho phép tôi sudo. Suy nghĩ?
w00t

1
@eggo @Sebi @calandoa @xaralis Lệnh này cũng hoạt động nếu tôi muốn sudo làm root trong debian 9? Bởi vì nếu tôi sử dụng: 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"nó không hoạt động: \ - nó chỉ nói "máy chủ từ xa đã bị ngắt kết nối"
user3450548

3

Bạn có thể sử dụng bindfs + sshfs để truy cập các tệp người dùng khác (thậm chí root).

Trước tiên, bạn gắn kết 'root' hoặc bất kỳ thư mục nào khác dưới người dùng của bạn với uid được ánh xạ lại.

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

và sau đó chỉ cần sshfs vào thư mục.

sshfs USER@SERVER:tmproot TARGET

Nhưng để bảo mật, tốt hơn hết là không ánh xạ toàn bộ root /mà chỉ là một phần mà bạn cần. Ví dụ: Bạn có thể sử dụng phương pháp này để gắn kết bất kỳ thư mục người dùng nào khác vào, ví dụ các tệp từ / var / www vào ~ / www và ánh xạ lại root vào người dùng của bạn để bạn có quyền truy cập đầy đủ vào nó.

Nếu bạn cần quyền truy cập để bảo vệ uid hoặc có quyền truy cập vào nhiều người dùng thì tôi sẽ tạo một người dùng mới, ví dụ "rootfs" với uid = 0 và / bin / false và thực hiện một sshfs bình thường.


0

Bạn có thể thử (nhưng tôi không nghĩ nó sẽ hoạt động):

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

Tôi không hiểu sshfs rất tốt, vì vậy bạn có thể có được một cái gì đó như thế để làm việc, nhưng tôi không thể nói làm thế nào, và tôi sẽ hơi ngạc nhiên.

Một khả năng khác là đặt lệnh 'sudo / bin / su bravo' trong ~ / .ssh / rc, nhưng điều đó sẽ ảnh hưởng đến tất cả các kết nối fs của bạn (giả sử nó hoạt động, tôi cũng nghi ngờ) cũng như việc sử dụng ssh bình thường của bạn .

Xin lỗi vì đã là một debbie downer.


0

Bằng cách suy luận, tôi nghĩ rằng điều này là không thể đạt được trong một lệnh đơn giản.

Điều này là do sshfs gọi ssh mà không thông qua bất kỳ lệnh nào, thay vào đó, sử dụng SFTP là một hệ thống con của SSH.

Từ sshfs manpage:

Trên máy tính từ xa, hệ thống con SFTP của SSH được sử dụng.

Ngoài ra , việc thay đổi người dùng hiện tại (hoặc 'su' hoặc 'sudo') không phải là một phần của giao thức SFTP, mặc dù đây có vẻ như là một tính năng rất thường được yêu cầu.


Điều này không phải là không thể. Giải pháp của Craisis hoạt động.
Jayen

Tất nhiên là có, vì anh ta ghi đè lệnh khởi động hệ thống con và thêm sudo. Tìm kiếm tốt nhưng bạn phải thiết lập sudo mà không cần mật khẩu (hoặc sử dụng dấu thời gian), điều này có thể làm giảm tính bảo mật. nhưng tôi sẽ không tranh luận vì OP thực sự muốn làm điều đó.
Weboide

0

Có lẽ, cách tốt nhất là thông qua quyền truy cập tệp, như @artifex đề xuất.

Như @Weboide nói, không thể thông qua sshfs.

Nhưng tôi đoán bạn có thể tạo một tập lệnh đơn giản, hãy gọi nó sudosshsẽ lấy $PWD, chuyển đổi nó thành /home/delta/và chạy lệnh qua sshsudotrên máy từ xa.

Một cái gì đó như thế này:

#!/usr/bin/env bash

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

Sau đó, bạn có thể thực hiện sudossh commandvà nhớ sử dụng các đường dẫn tương đối.

Nếu bạn sử dụng ssh-agent, bạn chỉ cần nhập sudomật khẩu của mình .


0

Giải pháp của tôi là cringingly xấu xí (nhờ vào một vài lớp chuỗi thoát), nhưng nó sẽ đọc đường dẫn đến sftp-servertừ /etc/ssh/sshd_configvà thực hiện nó thông qua sudo. Bây giờ nếu sshd_configkhông nằm dưới /etc/sshthì sao? Có thể tìm kiếm bên trong sshnhị phân với stringsgrep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.