私はサーバServerA(user1としてuser1)を持っています。user2をuser2として同じサーバに接続したいのですが、他のサーバからファイルを取得してServerAサーバー(ユーザーIDはuser2)。シェルスクリプト内でsshの内部でscpを使用する方法
できるだけ早く私を助けてください。
私はサーバServerA(user1としてuser1)を持っています。user2をuser2として同じサーバに接続したいのですが、他のサーバからファイルを取得してServerAサーバー(ユーザーIDはuser2)。シェルスクリプト内でsshの内部でscpを使用する方法
できるだけ早く私を助けてください。
user1としてscpを実行するのは簡単ではないでしょうか?その場合、ファイルをuser2にchownしますか? user2にしかアクセスできない場所に格納する必要がある場合は、user2にsuして移動することができます。
あなたがhostC(クライアント)にいて、userX @ hostAからuserY @ hostBにファイルをコピーしたいとします。
あなたはHOSTCにscpコマンドを発行できます。
scp [email protected]:file-to-copy [email protected]:destination-folder/
ただし、認証する必要があります。 userX @ hostAのためにssh鍵を設定した場合、鍵認証は正常に動作します。
scp
は、エージェント転送またはクリア転送キーを無効にするオプションを使用してssh
を呼び出します。したがって、userY @ hostBのキーを持っていても、hostBでは使用できず、パスワードを要求されます。
-S <ssh-command>
をscp
でhostC
に呼び出し、エージェント転送を妨げるオプションを取り除くためのラッパースクリプトを使用して、おそらく明示的に有効にする必要があります。
scp
を呼び出す
ssh-wrapper.py
#!/usr/bin/python
import sys, os
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
def which(program):
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
if __name__ == '__main__':
ssh = which('ssh')
assert ssh is not None
args = [ssh] + sys.argv[1:]
for x in ('-a','-oClearAllForwardings yes'):
if x in args:
args.remove(x)
if '-oForwardAgent yes' not in args:
args.insert(1,'-oForwardAgent yes')
os.execl(ssh,*args)
:
これまで
scp -S ssh-wrapper.py [email protected]:file-to-copy [email protected]:destination-folder/
'scp'は明示的にこれを行えないので、疑わしいセキュリティだと思います。あなたはあなたの資格を乱用しないように 'userA'を完全に信用しなければなりません。 – MattH
あなたの素早い対応のためにマットありがとうございますが、あなたは私の質問をしていないことを願っています。私はHostCサーバーに存在する自分のシェルスクリプトが同じサーバーHostCにログインするが、別のユーザーID(user2)でログインし、そこから別のサーバーHostBからファイルをコピーし、そこにファイルを保持する(サーバーHostC)。ファイルの所有者はuserid(user2)になります。 – user1109632
この場合、 'scp -S ssh-wrapper.py userX @ HostB:ファイルtoコピーuser2 @ HostC:宛先フォルダ/' – MattH
ヘルプなし。ファイルの所有権を変更することはできません。 – user1109632