scp和ssh方便好用而且安全,也许是为了更安全所以默认不会提供密码传参。
但如果你像我一样需要在运行脚本中自动填入scp或ssh的密码可以采用下面两种方法
第一种比较简单,直接使用sshpass命令传递密码
sshpass -p "your password" scp ./abc.txt hostname/abc.txt
第二种可以用expect
#!/usr/bin/expect
set timeout 30
spawn /bin/bash
expect -re "#|$"
send "rsync -e 'ssh ' -avzc youname@server_address:/mydata/game_log/ /data/log/\r"
expect {
<span style="white-space:pre"> </span>"password" { send "YOU_PASSWORD\r" }
<span style="white-space:pre"> </span>"yes/no" { send "yes\r"; exp_continue; }
}
expect -re "total size is"
expect -re "#|$"
send "exit\r"
其实可以看出expect是一个更灵活的设计,他其实是脱胎于tcl语言,也就是说你需要安装expect才能使用,这里注意脚本的第一行
#!/usr/bin/expect -f
这里就是告诉shell由expect来执行这个脚本,spawn命令则是与expect交互的shell命令。而在后面你可以通过expect来将交互命令中输出作为输入条件(这里的expect可不是shell里的而是expect中的expect),如果带-re表示采用正则。之后可以用send或exp_send对交互命令输入。总之你可以用这做出非常有意思的功能。
这样就OK了,祝你好运