sshpass原理分析

簡介

sshpass是一款自動為ssh填充密碼的開源插件,并沒有對ssh做任何修改,是從外部進行的操作。sshpass實現比較簡單,但是非常易用,原理與expect類似。sshpass主函數源碼只有500來行,在https://sourceforge.net/projects/sshpass/ 可以下載。

密碼填充方式

    sshpass密碼填充方式有三種,通過-p后邊的參數將密碼傳送過去,讀取文件第一行作為密碼傳過去,或者通過-e將名字為SSHPASS的環(huán)境變量作為密碼傳過去。
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:  //密碼來自變量,使用-p或者SSHPAS環(huán)境變量
    write( fd, args.pwsrc.password, strlen( args.pwsrc.password ) );
    write( fd, "\n", 1 );
    break;
    }
}

密碼填充原理

    這里大概畫了一張sshpass的原理圖。
sshpass原理圖
    當main函數開始執(zhí)行,主進程執(zhí)行`masterpt=posix_openpt(O_RDWR);`此時會有一個偽終端,然后fork()出一個子進程,在子進程下執(zhí)行ssh命令,當收到帶有*assword關鍵詞的輸出時候講密碼填充進去。

sshpass 使用方式

    sshpass 命令放在ssh命令之前,sshpass 與ssh分別將自己的命令參數放到自己后面。
sshpass "command params"  ssh root@127.0.0.1 "ssh's command params"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容