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
cat /etc/hosts | ssh otherhost "Sudo sh -c 'cat >/etc/hosts'"
はトリックを行います。
ローカルではなく、リモートホストで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のような構成管理システムを使用する方が長期的な選択として適している場合があります...
これは、sshコマンドを呼び出すのではなく、Paramiko(ネイティブPython SSHクライアント))を使用して簡単に実行できます。
Paramikoがscpに使用され、Sudoでコマンドを実行する例は数多くあります。これらはWebで入手できます。
おそらくやりたいことは、rootが所有する必要があるこのファイルのsuidビットをオンにすることです。その後、非特権ユーザーがスクリプトを実行すると、スーパーユーザーとして実行されます。
ここでの問題は、ファイルを非特権ユーザーとしてリモートサーバーにコピーしようとしていることです(scp
コマンドでログイン資格情報を使用します)。
リモートコンピュータでSudo
を利用するには、そこでコマンドを実行して転送を開始する必要があります。次のようになります。
ssh [email protected] Sudo scp [email protected]:/etc/hosts /etc/hosts
これにより、基本的に通常のユーザーとしてリモートコンピューターにログインし、Sudo
コマンドを発行して、ファイルをローカルコンピューターからリモートコンピューターにコピーします。 scp
ロジックは、リモートホストの観点から実行されているため、少し後ろ向きになります。
ただし、スクリプトからパスワードを受け入れるようにsshを取得するには、いくつかの作業が必要になる場合があります。特に、リモートコンピューターにログインして、ローカルコンピューターに再度ログインするように指示しているためです。