sudoを使用したリモートサーバーへのscp


63

サーバーAにファイルがあります(NATの背後にあるため、直接アドレス指定できません)。ファイルは、ルートに制限されたディレクトリのサーバーBにコピーする必要があります。サーバーBにsudo特権を持つアカウントがあります。scpコマンドの構文は何ですか?



質問の質問者がその質問の所有権を取り戻すことはなかったので、私はこの質問の複製として古い質問を閉じました。
いんちきキホーテ

scpをカスタマイズして、sudoを直接行う方法については、別の投稿で回答しました。これは、WinSCPの機能に似ています。
ヨーヨー

回答:


56

まず、sudoを使用せずに書き込みアクセスできる場所にファイルをコピーする必要があります。

scp yourfile serverb:

次に、sudoを使用してファイルを移動します

ssh serverb sudo mv yourfile /path/to/the/destination

書き込み可能な場所がない場合は、ユーザーの書き込み権限を持つ一時ディレクトリを作成します。

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmpは、(通常)すべてのユーザーがアクセスできる一時ファイルを書き込むのに適した場所です。
ダグ・ハリス

3
@Doug:/ tmpはRAMまたは/マウントポイントにあり、大きなファイルをホストするのに必ずしも十分ではないことに注意してください。
ラバコール

2
何を達成しようとしても、chmod 777通常それは間違った方法です。他の誰かがログインし、このコードを実行しようとしていることを知っていた場合に何が起こるか考えてください。
トリプリー14

1
ssh sudo私のために動作しません-「ttyが存在せず、askpassプログラムが指定されていません」と文句を言いますか?
ロスプレッサー

46

SCPでは、2つのステップで行う必要がありますが、次のようにrsyncで1つで行うことができます。

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

注:これには、NOPASSWDsudo構成が必要です。sudoのパスワードを入力する必要がある場合は、2段階の方法が必要です。

ディレクトリをコピーするには、-rパラメーターを追加する必要があります。また-v、詳細な出力用。


資格情報で上記の方法を使用するには、それらを~/.ssh/configファイルに追加する必要があります。例えば

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
これが最も簡単な方法です。
マットホワイト14

エラーをsudo: sorry, you must have a tty to run sudo修正しました -e "ssh -tt"
mj41

@ mj41で-e "ssh -tt"、私は得るprotocol version mismatch -- is your shell clean?。それを修正する方法についてのヒントはありますか?
x。

19

これを回避するには、sshとtarを使用できます。

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

これは最初にsudoタイムスタンプを更新し(必要に応じてパスワードを要求し、tty(ssh -t)を必要とします)、次にsudoを使用してtarballをリモートで作成し、ローカルに抽出します。

RedHat 5の「tar」では、「xpsf-」コマンドの後に「--preserve」オプションが必要です。


注:を取得した場合tar: Invalid replacement string、を削除する-sと修正されるようです(sとにかく何が必要かはわかりません)。どうもありがとう; これはすごい。
再帰的

これをtty_tickets無効にする必要がありますか?
ジェイコブバディン

@JacobBudinはい。
ブルー化された

4

たとえば、sudoコマンドでsftpを使用できます。

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

これとrsyncメソッドは、おそらく1ステップでそれを行う最も直接的な方法です。残念ながら、antのscpタスクはそれをサポートしていません。sftpを使用するように設定できますが、リモートサブプログラムを変更することはできません。サブプログラムはサーバーの種類によって異なることに注意してください(ソラリスは異なる場合があります)。
ヨーヨー

0

毎回sudoのパスワードを入力する必要がある場合、ファイルに保存できます。

echo "Enter password: "; read -s password; echo $password > password_file

その後、ソースファイルとともに送信します。

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

moreutilsがない場合teesponge、代わりに使用できます。



-1
current server $ sudo scp username@server:source/path/filename /tmp/

特定のファイルをソースから現在のサーバーの/ tmp /にコピーします


sudoをローカルで実行し、昇格した権限をリモートで提供しません。
ヨーヨー

@Yoyoが言うように、これはうまくいきません。
マニ

それはルートの鍵を読み出しますので、SCPはおそらく、接続されません
ピエール・オリヴィエVares
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.