sshfsでsudoを実行するにはどうすればよいですか?


35

ローカルホストalphaには、次のようにfoosshfs経由でホストにマップされるディレクトリがありbravoます。

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

ただし、ホストbravoには別のユーザーdeltaがあり、sudo /bin/suそれを使用して作業を行うことができますbravo:/home/deltadeltassh経由でログインできない場合があります。私が変更できない理由のために、あなたがマシン上にいる場合にのみデルタにsudoすることができます。

通常、にsshしてbravoからdeltaにsudoしますが、チャーリーのホームディレクトリをssh経由でマウントしたときに、それを実行できる方法があるかどうか疑問に思っています。


2
これは、ファイルのアクセス許可を使用して解決するのが最適です。
artifex

回答:


36

これは、接続しているサーバーのOSによって異なります。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バイナリの場所を探します。

NOPASS:{path to sftp-server}でsudoをセットアップするか、で更新されたタイムスタンプを持つssh user@host sudo -vように事前検証する必要があるかもしれません。私の場合、私の2つのコマンドは次のとおりです。sudonotty

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
おかげで、これは非常にきちんとした「トリック」です。私はちょうど私の状況のためのsudoに「-u <some_other_user>」を追加
JOR

1
非常に良い、完璧に働いた。私の唯一のポイントは、例に/ usr / bin / sudoが2回あるということです。これは不要なようです。
xaralis

1
@Craisis古い投稿を表示して申し訳ありませんが、基本ユーザーでCentOS 6.5サーバーにsshしますが、ルートアクセスのみのフォルダーをマウントします。これは正しいsshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server"でしょうか?
ドンラミー14年

1
ssh host sudo -vsudoが幸せにならない-sudoを許可する前にttyが必要です。考え?
w00t

1
@eggo @Sebi @calandoa @xaralisこのコマンドは、Debian 9のルートとしてsudoを使用したい場合にも機能しますか?私が使用している場合ので: 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にマウントし、rootをユーザーに再マッピングして、完全にアクセスできるようにします。

uidを保持するためにアクセスする必要がある場合、または複数のユーザーにアクセスする場合は、uid = 0および/ bin / falseで「rootfs」などの新しいユーザーを作成し、通常のsshfsを実行します。


0

あなたは試すかもしれません(しかし、私はそれがうまくいくとは思わない):

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

私はsshfsをあまりよく理解していないので、あなたはそのようなものを動作させることができるかもしれませんが、私はその方法を言うことができず、私は少し驚いています。

別の可能性は、コマンド 'sudo / bin / su bravo'を〜/ .ssh / rcに入れることですが、それはすべてのfsマウント(それが機能すると仮定しますが、これも疑わしい)とsshの通常の使用に影響します。

デビーダウナーでごめんね。


0

推論により、私はこれを簡単なコマンドで達成することは不可能だと思います。

これは、sshfsがコマンドを渡さずにsshを呼び出しますが、代わりにSSHのサブシステムであるSFTPを使用するためです。

sshfsマンページから:

リモートコンピューターでは、SSHのSFTPサブシステムが使用されます。

さらに、現在のユーザー(または「su」または「sudo」)を変更することはSFTPプロトコルの一部ではありませんが、これは非常に頻繁に要求される機能のようです。


これは不可能ではありません。Craisisのソリューションは機能します。
ジェイエン

もちろん、サブシステムを起動してsudoを追加するコマンドをオーバーライドするため、そうです。良い発見ですが、パスワードなしでsudoを設定する必要があります(またはタイムスタンプを使用します)。これにより、セキュリティが低下する可能性があります。しかし、OPが本当にそれを望んでいたので、私は議論しません。
Weboide

0

@artifexが提案するように、おそらく最良の方法はファイルのアクセス許可を使用することです。

@Weboideが言うように、sshfsでは不可能です。

しかし、私は、あなたがのは、それを呼びましょう、簡単なスクリプトを作成することができると思いsudossh、あなたを取ること$PWD、に変換/home/delta/してを介してコマンドを実行するsshsudo、リモートマシン上で。

このようなもの:

#!/usr/bin/env bash

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

その後、実行sudossh commandして、相対パスを使用することを忘れないでください。

ssh-agentを使用する場合は、sudoパスワードを入力するだけです。


0

私の解決策はひどくいです(文字列が数層エスケープされるおかげです)が、sftp-serverfrom へのパスを読み取り、/etc/ssh/sshd_configそれを実行しますsudo。では、sshd_config下にない場合はどうなり/etc/sshますか?たぶん、sshバイナリで内部を検索stringsgrepますか?

#!/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.