简介
sshpass是一款自动为ssh填充密码的开源插件,并没有对ssh做任何修改,是从外部进行的操作。sshpass实现比较简单,但是非常易用,原理与expect类似。sshpass主函数源码只有500来行,在https://sourceforge.net/projects/sshpass/ 可以下载。
密码填充方式
sshpass密码填充方式有三种,通过-p后边的参数将密码传送过去,读取文件第一行作为密码传过去,或者通过-e将名字为SSHPASS的环境变量作为密码传过去。
void write_pass(
int fd )
{
switch( args.pwtype ) {
case PWT_STDIN:
write_pass_fd( STDIN_FILENO, fd );
break;
case PWT_FD:
write_pass_fd( args.pwsrc.fd, fd );
break;
case PWT_FILE:
{
int srcfd=open( args.pwsrc.filename, O_RDONLY );
if( srcfd!=-
1 ) {
write_pass_fd( srcfd, fd );
close( srcfd );
}
}
break;
case PWT_PASS:
write( fd, args.pwsrc.password,
strlen( args.pwsrc.password ) );
write( fd,
"\n",
1 );
break;
}
}
密码填充原理
这里大概画了一张sshpass的原理图。
当main函数开始执行,主进程执行`masterpt=posix_openpt(O_RDWR);`此时会有一个伪终端,然后fork()出一个子进程,在子进程下执行ssh命令,当收到带有*assword关键词的输出时候讲密码填充进去。
sshpass 使用方式
sshpass 命令放在ssh命令之前,sshpass 与ssh分别将自己的命令参数放到自己后面。
sshpass
"command params" ssh root
@127.
0.
0.
1 "ssh's command params"