私はこのようなことをしたい:
scp local_file remote_server:/some_directory
ただし、/some_directoryの権限を取得するには、を呼び出す必要がありますsudo
。同様の質問がここで何度も要求されたことを知っていますが、ほとんどの回答はパスワードキャッシュを使用するか(sudo
何らかの理由で2回の連続呼び出しでは機能しないようですssh
)sudo
SSHをrootとして許可できます)。
後者の場合、両方のソリューションは安全に見えないため、ルートになる必要がないため、sudo
システムを再構成できないとします。この場合、単にファイルをコピーするにはどうすればよいですか?
これまでに試したことは次のとおりです。
(
read -s -p 'Enter password: ' pass;
echo $pass ;
tar cf - local_file ) | ssh -t -t remote_server 'sudo tar -C /some_directory' )
もっと良い方法がありますか?
答え1
私はこの問題を解決するためのエレガントな方法を見つけました名前付きパイプ。アイデアは、リモート側で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
これはfiles
SSH接続を介して複製されます。もちろん、リモートサーバーから直接tarballを作成してユーザーがアクセスできるようにすることもできますが、これを行うにはアーカイブのすべてのスペースが必要なため、使用できない場合があります。
これを完了したら、fifo
簡単なファイルで削除できます。
remote$ rm /home/anarcat/tmpfifo