web-dev-qa-db-ja.com

/ etc / hostsをすべてのマシンにコピーするにはどうすればよいですか?

import os, sys, time

servers = ['dev','admin','db1']
for s in servers:
    cmd = 'scp /etc/hosts regular_user@%s:/etc/hosts' % s
    print cmd
    os.system(cmd)

このスクリプトを作成して、現在のHOSTSファイルを他のすべてのサーバーにコピーしました。ただし、これはROOTではなく通常のユーザーから行いたいと思います。

/ etc/hostsを上書きするとルート権限が取得されるので、Sudoを実行したいと思います。そのスクリプト内にSudoを入れるにはどうすればよいですか?

/ etc/hostsファイルを変更する権限が拒否されているため、これは機能しません。

cmd = 'Sudo scp /etc/hosts regular_user@%s:/etc/hosts' % s
2
Alex

cat /etc/hosts | ssh otherhost "Sudo sh -c 'cat >/etc/hosts'"はトリックを行います。

6
Jim Zajkowski

ローカルではなく、リモートホストでSudoを実行する必要があります。明らかにこれが機能するためには、リモートホスト上のアカウントに関連するコピーコマンドを実行するためのSudo権限が必要です。次のようになります。

cmd = 'scp /etc/hosts regular_user@%s:/tmp/hosts' % s
os.system(cmd)
cmd = 'ssh regular_user@%s Sudo cp /tmp/hosts /etc/hosts' % s
os.system(cmd)

ファブリックのようなフレームワーク、またはcfengineやpuppetのような構成管理システムを使用する方が長期的な選択として適している場合があります...

1
easel

これは、sshコマンドを呼び出すのではなく、Paramiko(ネイティブPython SSHクライアント))を使用して簡単に実行できます。

  • Paramikoを使用して、ファイルをリモートサーバーの/ tmpにscpします。
  • Paramikoを使用して、削除サーバーで「Sudo cp/tmp/hosts/etc/hosts」を実行します。

Paramikoがscpに使用され、Sudoでコマンドを実行する例は数多くあります。これらはWebで入手できます。

1
mikemaccana

おそらくやりたいことは、rootが所有する必要があるこのファイルのsuidビットをオンにすることです。その後、非特権ユーザーがスクリプトを実行すると、スーパーユーザーとして実行されます。

0
ennuikiller

ここでの問題は、ファイルを非特権ユーザーとしてリモートサーバーにコピーしようとしていることです(scpコマンドでログイン資格情報を使用します)。

リモートコンピュータでSudoを利用するには、そこでコマンドを実行して転送を開始する必要があります。次のようになります。

ssh [email protected] Sudo scp [email protected]:/etc/hosts /etc/hosts

これにより、基本的に通常のユーザーとしてリモートコンピューターにログインし、Sudoコマンドを発行して、ファイルをローカルコンピューターからリモートコンピューターにコピーします。 scpロジックは、リモートホストの観点から実行されているため、少し後ろ向きになります。

ただし、スクリプトからパスワードを受け入れるようにsshを取得するには、いくつかの作業が必要になる場合があります。特に、リモートコンピューターにログインして、ローカルコンピューターに再度ログインするように指示しているためです。

0
jheddings