使用scp定期将文件从1个unix服务器复制到另一个服务器并执行某些操作。要快速执行此操作,我希望使用一个unix脚本来执行scp并输入完成scp所需的密码。
我已尝试使用expect命令通过unix命令行发送密码,但到目前为止无法实现此目的。
示例命令
scp ./abc.txt hostname/abc.txt
expect "*password:*"
send "mypassword\r"
我收到这些错误:
couldn't read file "password: ": no such file or directory
myscript.sh[5]: send: not found [No such file or directory]
我错过了什么吗?
答案 0 :(得分:20)
只需在sshpass -p "your password"
命令
scp
即可
sshpass -p "your password" scp ./abc.txt hostname/abc.txt
答案 1 :(得分:6)
解决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来生成公钥/私钥,并在远程登录时执行key pairing。我不记得所有步骤,但是您生成了两个文件(一个包含公钥,一个包含私钥),并配置PuTTY以在登录远程站点时使用这两个文件。如果该远程站点是Linux / Unix / Mac,则可以复制公钥并将其放入authorized_keys
文件中。
如果您可以使用SSH公钥/私钥,则可以不再需要脚本中的密码。否则,您必须使用Expect或Perl与Net::SSH之类的东西,它们可以监视远程主机并在提示时输入密码。
答案 2 :(得分:4)
您应该使用开放密钥进行更好的身份验证。在这种情况下,您不需要密码也不需要。
如果您想要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
此外,您可以使用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()
答案 3 :(得分:2)
David提到的Firts,我们需要设置公钥/私钥。
然后使用下面的命令对我有用,意味着它没有提示我输入密码,因为我们使用-i选项在命令中传递私钥
scp -i path/to/private_key path/to/local/file remoteUserId@remoteHost:/path/to/remote/folder
此处path / to / private_key是我们在设置公钥/私钥时生成的私钥文件。
答案 4 :(得分:2)
//将/tmp/abc.txt复制到/tmp/abc.txt(目标路径)
// 10.1.1.2的用户名和密码是“username”和“password”
sshpass -p "password" scp /tmp/abc.txt username@10.1.1.2:/tmp/abc.txt
//安装sshpass(ubuntu)
sudo apt-get install sshpass
答案 5 :(得分:-2)
以下是我如何解决它。
这不是最安全的方式,但它解决了我的问题,因为安全性不是内部服务器上的问题。
创建一个新文件,说password.txt
并存储要粘贴文件的服务器的密码。将其保存到主机服务器上的某个位置。
scp -W location/password.txt copy_file_location paste_file_location
干杯!