web-dev-qa-db-ja.com

ローカルファイルをリモートサーバーにコピーします。sudoに対するroot以外の権限がありますか?

私は次のようなことをしたいと思います:

scp local_file remote_server:/some_directory

ただし、/ some_directoryへの特権を取得するには、Sudoを呼び出す必要があります。ここでも同様の質問が何度も行われていることは知っていますが、ほとんどの回答はSudoのパスワードキャッシュ(何らかの理由で2回の連続したssh呼び出しでは機能しないようです)または事実を利用していました。私たちがルートであること(パスワードなしのSudoを設定するか、SSHをルートに入れることができます)。

後者の場合、どちらのソリューションも安全ではないように思われるため、Sudoを呼び出してrootになることはなく、システムを再構成できないと想定したいと思います。このような状況でファイルをコピーするだけで何ができるでしょうか。

これまでの私の試みは次のとおりです。

( 
read -s -p 'Enter password: ' pass; 
echo $pass ; 
tar cf - local_file ) | ssh -t -t remote_server 'Sudo tar -C /some_directory' )

より良い方法はありますか?

3
d33tah

名前付きパイプ を使用してこれらの問題を回避するエレガントな方法を見つけました。アイデアは、リモート側で [〜#〜] fifo [〜#〜] ソケットを介してtarコマンドを実行し、そのソケットを通常のユーザーが読み取れるようにすることです。

これが例です。リモート側では、最初にソケットを作成します。

remote$ Sudo -s 
remote# mkfifo -m 600 /home/anarcat/tmpfifo
remote# chown anarcat /home/anarcat/tmpfifo

ローカル側では、すでにそのソケットの読み取りを開始できます。

local$ ssh example.net "cat tmpfifo" | pv -s 2G | tar xfz -

pv -s 2G |部分は完全にオプションであり、 パイプビューア で素敵なプログレスバーを取得します。)

次に、リモート側で、書き込みを開始できます。

remote# tar cfz /home/anarcat/tmpfifo files

これにより、SSH接続を介してfilesがコピーされます。もちろん、そのtarballをリモートサーバー上に直接作成してユーザーがアクセスできるようにすることもできますが、その場合、アーカイブのすべてのスペースが必要になり、使用できない可能性があります。

これが完了したら、fifoを単純なファイルとして削除できます。

remote$ rm /home/anarcat/tmpfifo
2
anarcat