1行でサーバー間で保護されたファイルをコピーしますか?

1行でサーバー間で保護されたファイルをコピーしますか?

squid.confあるサーバーから別のサーバーにコピーしたいです。

  • サーバーは互いに通信しません。私のワークステーションを確認したいです。
  • 両方のサーバーにこのファイルがあるため、ターゲットは上書きされます。
  • これらのファイルには600権限があり、ルートが所有しています。
  • SSHを介したルートログインが無効になっています(PermitRootLogin no)。
  • 設定ガイドの一部になりますので、可能であれば一行で作成したいと思います。

やるわ

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

サーバー間でファイルをコピーし、権限を維持します。ただし、この場合、「権限が拒否されました」というメッセージが表示されます。

私もこれができることを知っています:

ssh -t source 'sudo cat /etc/squid/squid.conf'

これ-tにより、sudoはファイルの内容を出力する前に管理者パスワードを要求できます。

問題は、これらの技術を組み合わせて各サーバーにsudoパスワードを要求し、ファイルを宛先に転送する方法がわからないことです。可能ですか?

修正する:これが私が思いつく最善の方法です:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

それをラインと呼ぶのはストレッチのようです。私はセットアップガイドでこれを別々の段階に分ける必要があると思いました。

答え1

sudoを使用してsshに接続するよりも、sshを使用してsshに接続する方が簡単です。したがって、SSHサーバーの設定を変更するのは問題ありません。各サーバーのルートに対してSSHを開くことをお勧めしますが、localhostでのみ開くことをお勧めします。Match次のセクションを使用してこれを実行できますsshd_config

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

その後、リモート・ユーザーからローカル・ユーザーに、ローカル・ユーザーから root キー・ベースの認証チェーンを設定できます。それでも認証トレース機能があるので、ログを介して誰がrootとしてログインしたのかがわかります。

サーバーにルートとして接続するには、~/.ssh/config次のようにエイリアスを定義します。

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

これを使うとこだわるなら、端末で読み込みにこだわり(あなたのアカウントに対するチケットがあっても)、一般的なファイルコピー方法(scp、sftp、rsync)のどれも使用しないので、別途sudoのコマンドが必要だと思います。sudoリモート端末とのやり取りをサポートします。

sshとsudoを使用すると、提案するコマンドを簡素化できます。両方で sudo が絶対パスワードを要求しないように設定した場合は、一度実行してパスワードの要件を完了し、再度実行してファイルをコピーできます。 (パスワードプロンプトが邪魔になるため、簡単にファイルをコピーすることはできません。)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹がなければNOPASSWD尋ねません。

答え2

sudo次に、パスワードを要求しないように設定できます。

源泉:

user    ALL=NOPASSWD:/bin/cat

見積もりが正確です。

user    ALL=NOPASSWD:/usr/bin/tee

コンピュータで次の操作を行います。

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

しかし、私は次のようなものを使用することをお勧めします人形。プロファイル展開の問題をよりよく簡単に解決できます。

PS。ただし、sudoユーザーにパスワードを要求するように設定すると、その文字列がターゲット[sudo] password for userファイルに表示されます。

答え3

SSHを使用する代わりに、scpを使用してサーバー間でファイルを転送できます。

ターゲットサーバーにログインします。

ファイルをコピーするターゲットディレクトリに変更します。

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - 再帰 p - 元のファイルの変更時間、アクセス時間、およびモードを維持します。

答え4

SSH構成を変更することなく、server2へのSSH接続を介して2つのSSHトンネル、ホスト - >サーバー1とサーバー2 - >ホストを作成できます。ホストから両方のトンネル(同じポート)を接続します。次に、server2でsudoを実行して、server1に接続されているトンネルからデータを取得し、それをserver2に保存します。

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

アイデアは次のとおりです。 1-ポート 60000 で、コンピュータからソース コンピュータにローカル トンネルを作成します。

ssh -L60000:${source}:22

1b - コンピュータで再度リモートトンネルを作成する

-R60000:localhost:60000

2- ターゲットコンピュータに接続

-t ${target}

3-書き込みのために、ターゲットコンピュータからrootとしてすべてを実行します。

'sudo bash -c "..."'

4-トンネルを介してソースマシンに接続します。 whoamiとon localhostは、$ {target}システムのローカルホストを表します。

ssh -p 60000 '$(whoami)'@localhost

5-リモートファイルを圧縮して標準出力に圧縮して送信します。

cd /path/to/dir; tar -czf - file

6- stdoutを介してパッケージを受け取り、それに応じて/ path / to / targetディレクトリにファイルを抽出します。

|tar -C/path/to/target -xzf -

注:最大3つのSSHkey確認と3つのパスワード要求を受け取ることができます。ただし、ファイルはコピーされます。

関連情報