che*_*891 11 unix bash shell ksh scp
使用scp定期将文件从1个unix服务器复制到另一个服务器并执行某些操作.要快速执行此操作,我希望使用一个unix脚本来执行scp并输入完成scp所需的密码.
我已经尝试了expect命令通过unix命令行发送密码,但到目前为止无法实现这一点.
示例命令
scp ./abc.txt hostname/abc.txt
expect "*password:*"
send "mypassword\r"
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
couldn't read file "password: ": no such file or directory
myscript.sh[5]: send: not found [No such file or directory]
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
Akk*_*kki 21
只需sshpass -p "your password"
在scp
命令的开头传递即可
sshpass -p "your password" scp ./abc.txt hostname/abc.txt
Run Code Online (Sandbox Code Playgroud)
其中一个要解决登录问题与方式ssh
,scp
以及sftp
(全部使用相同的协议和sshd
服务器)是建立公共/私有密钥对.
有些服务器可能不允许这样做,但大多数网站都没有.这些说明适用于Unix/Linux/Mac.与往常一样,尽管Windows上的cygwin环境确实遵循这些步骤,但Windows有点不同.
ssh-keygen
.这可能因系统而异,但程序应引导您完成此操作.ssh-keygen
完成后,你将有$HOME/.ssh
你的机器上的目录.该目录将包含公钥和私钥.随着您的生成,将会生成另外两个文件.一个known_hosts
包含您登录的所有已知主机的指纹.第二个将被调用authorized_keys
或authorized_keys2
取决于您的实现.ssh-keygen
那里运行.这将在$HOME/.ssh
那里生成一个目录以及私钥/公钥对.如果$HOME/.ssh
目录已存在且具有公钥和私钥文件,请不要这样做.你不想重新生成它.$HOME/.ssh
目录中的远程服务器上,创建一个名为的文件authorized_keys
.在此文件中,输入您的公钥.此公钥位于$HOME/.ssh
本地计算机上的目录中.它将结束*.pub
.将其中的内容粘贴到authorized_keys
.如果authorized_keys
已存在,请将您的公钥粘贴到下一行.现在,当您使用ssh
或使用scp
或登录时sftp
,您将不需要输入密码.顺便说一句,两台机器上的用户ID不必同意.我作为不同的用户登录了许多远程服务器并设置了我的公钥,authorized_keys
并且没有直接登录到该用户的问题.
如果您使用Windows,则需要一些可以执行的操作ssh
.我认识的大多数人都使用可以生成公钥/私钥的PuTTY,并在远程登录时进行密钥配对.我不记得所有步骤,但是您生成了两个文件(一个包含公钥,一个包含私钥),并配置PuTTY以在登录远程站点时使用这两个文件.如果该远程站点是Linux/Unix/Mac,则可以复制公钥并将其放入authorized_keys
文件中.
如果您可以使用SSH公钥/私钥,则可以消除脚本中对密码的需求.否则,您将不得不使用Expect或Perl与Net :: SSH之类的东西,它可以监视远程主机并在出现提示时输入密码.
您应该使用开放密钥进行更好的身份验证。在这些情况下,您不需要密码,也不需要期望。
如果您想要它expect
,请使用此脚本(请参阅回答Automate scp file transfer using a shell script):
#!/usr/bin/expect -f
# connect via scp
spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "PASSWORD\r"
}
}
interact
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用pexpect
(python 模块):
def doScp(user,password, host, path, files):
fNames = ' '.join(files)
print fNames
child = pexpect.spawn('scp %s %s@%s:%s' % (fNames, user, host,path))
print 'scp %s %s@%s:%s' % (fNames, user, host,path)
i = child.expect(['assword:', r"yes/no"], timeout=30)
if i == 0:
child.sendline(password)
elif i == 1:
child.sendline("yes")
child.expect("assword:", timeout=30)
child.sendline(password)
data = child.read()
print data
child.close()
Run Code Online (Sandbox Code Playgroud)
che*_*891 -4
这是我解决的方法。
这不是最安全的方法,但它解决了我的问题,因为安全性在内部服务器上不是问题。
创建一个新文件password.txt
,并存储要粘贴该文件的服务器的密码。将其保存到主机服务器上的某个位置。
scp -W location/password.txt copy_file_location paste_file_location
Run Code Online (Sandbox Code Playgroud)
干杯!