web-dev-qa-db-ja.com

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

ローカルホストalphaに、次のようにsshfsを介してホストfooにマップされたディレクトリbravoがあります。

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

ただし、ホストbravoには、別のユーザーdeltaがいますSudo /bin/suとして、私がbravo:/home/deltadeltaはssh経由でログインできない場合があります。私が変更できない理由のために、あなたはあなたがマシンにいるときだけあなたはデルタにSudoをすることができます。

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

36
dirtside

これは、接続しているサーバーの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をセットアップするか、Sudonottyのタイムスタンプを更新できるように、ssh user@Host Sudo -vで事前検証する必要がある場合があります。私の場合、2つのコマンドは次のとおりです。

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"
38
Craisis

Bindfs + sshfsを使用して、他のユーザーファイル(ルートも含む)にアクセスできます。

最初に、「ルート」または再マッピングされた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を実行します。

3
kolorafa

おそらく、@ 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
chmeee

私の解決策はcringingly醜いです(文字列のエスケープのいくつかの層のおかげです)、sftp-serverから/etc/ssh/sshd_configへのパスを読み取り、Sudoを介して実行します。ここで、sshd_config/etc/sshの下にない場合はどうなりますか?多分sshstringsgrepバイナリ内を検索しますか?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"Sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
0

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

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

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

もう1つの可能性は、コマンド 'Sudo/bin/su bravo'を〜/ .ssh/rcに置くことですが、これは、すべてのfsマウント(機能すると仮定します)に影響し、通常のsshの使用にも影響します。 。

デビーダウナーでごめんなさい。

0
Slartibartfast

控除によって、これは単純なコマンドで達成するために不可能だと思います。

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

sshfsマンページから:

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

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

0
Weboide