libssh 라이브러리 사용할 때 openssl을 꼭 설치해야하나요? (getpass function 에 관한 질문도 있습니다)
글쓴이: djkim87 / 작성시간: 수, 2013/05/22 - 7:49오후
첫번째 질문은 libssh 라이브러리를 사용하려면 openssl을 설치해야하는지 입니다.
현재 윈도우즈에서 qt creator툴로 libssh를 테스트하려고 하는데 잘 안되서 리눅스에서 테스트 하려고 libssh를 깔려고 하는데 INSTALL 문서에 OPEN SSL 을 선행해서 깔아줘야 된다고 하더라구요. 윈도우즈에서 할때는 그냥 라이브러리링크시켜서 하면 컴파일까진 잘되는데 동작이 안되서 혹시 이것때문일까요? OPENSSL 을 깔아볼까 했는데 깔려고 하니 첫화면에 VISUAL C++ 2008 인가?가 없다고 무시무시한 경고문을 날리네요 ㅠㅠ VISUAL STUDIO 없고 걍 QT에 포함되 MinGW 32bit 컴파일러만 써서요. 이 문제를 어찌할지 조언 좀 부탁드리겠습니다 ㅠㅠ
두번째 문제는 getpass() function 문제입니다. 이 함수가 libssh 튜토리얼에 포함되어 있어서 찾아봤는데 conio.h 에 정의되어 있다 하더라구요. 근데 conio.h 를 include 해도 계속 정의되지 않았다고 하네요... 어떤 문서는 sys/types.h랑 unistd.h 에 정의되어 있다고 해서 포함시켜봤는데도 정의되지 않았다고 나오네요. 찾아보니 윈도우 환경에서도 잘 되는것 같은데 무슨 문제일까요..?
마지막으로 테스트용 소스인데 혹시 소스에 문제점이 있으면 조언좀 부탁드리겠습니다.
#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <libssh/sftp.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BACKSPACE 8
int sftp_helloworld(ssh_session session, sftp_session sftp)
{
int access_type = O_WRONLY | O_CREAT | O_TRUNC;
sftp_file file;
const char *helloworld = "Hello, World!\n";
int length = strlen(helloworld);
int rc, nwritten;
//TODO:
file = sftp_open(sftp, "/home/myex/test.txt",
access_type, S_IRWXU);
if (file == NULL)
{
fprintf(stderr, "Can't open file for writing: %s\n",
ssh_get_error(session));
return SSH_ERROR;
}
nwritten = sftp_write(file, helloworld, length);
if (nwritten != length)
{
fprintf(stderr, "Can't write data to file: %s\n",
ssh_get_error(session));
sftp_close(file);
return SSH_ERROR;
}
rc = sftp_close(file);
if (rc != SSH_OK)
{
fprintf(stderr, "Can't close the written file: %s\n",
ssh_get_error(session));
return rc;
}
return SSH_OK;
}
int sftp_helloworld(ssh_session session)
{
sftp_session sftp;
int rc;
sftp = sftp_new(session);
if (sftp == NULL)
{
fprintf(stderr, "Error allocating SFTP session: %s\n",
ssh_get_error(session));
return SSH_ERROR;
}
rc = sftp_init(sftp);
if (rc != SSH_OK)
{
fprintf(stderr, "Error initializing SFTP session: %d.\n",
sftp_get_error(sftp));
sftp_free(sftp);
return rc;
}
//TODO:
sftp_helloworld(session, sftp);
sftp_free(sftp);
return SSH_OK;
}
//need to fix
char* getpass( char password[12] )
{
int i = 0, ich;
while(1)
{
ich = getch();
/* 엔터 키가 입력되었다면 종료*/
if( ich == '\r' )
{
password[i]= '\0';
break;
}
/* 입력된 문자가 알파벳이거나 숫자라면 저장하고 */
if( isalnum( ich ) )
{
password[i++] = (char)ich;
putch( '*' );
}
/* 입력된 문자가 BACKSPACE라면 한 문자 뒤로 이동한 후에
마지막 글자를 공백문자로 지우고 다시 뒤로 이동 */
else if( ich == BACKSPACE )
{
if( i )
{
putch( ich );
putch( ' ' );
putch( ich );
i--;
}
}
}
return password;
}
int verify_knownhost(ssh_session session)
{
int state, hlen;
unsigned char *hash = NULL;
char *hexa;
char buf[10];
state = ssh_is_server_known(session);
hlen = ssh_get_pubkey_hash(session, &hash);
if(hlen < 0)
return -1;
switch (state)
{
case SSH_SERVER_KNOWN_OK:
break; /* ok */
case SSH_SERVER_KNOWN_CHANGED:
fprintf(stderr, "Host key for server changed: it is now:\n");
ssh_print_hexa("Public key hash", hash, hlen);
fprintf(stderr, "For security reasons, connection will be stopped\n");
free(hash);
return -1;
case SSH_SERVER_FOUND_OTHER:
fprintf(stderr, "The host key for this server was not found but an other"
"type of key exists.\n");
fprintf(stderr, "An attacker might change the default server key to"
"confuse your client into thinking the key does not exist\n");
free(hash);
return -1;
case SSH_SERVER_FILE_NOT_FOUND:
fprintf(stderr, "Could not find known host file.\n");
fprintf(stderr, "If you accept the host key here, the file will be"
"automatically created.\n");
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
case SSH_SERVER_NOT_KNOWN:
hexa = ssh_get_hexa(hash, hlen);
fprintf(stderr,"The server is unknown. Do you trust the host key?\n");
fprintf(stderr, "Public key hash: %s\n", hexa);
free(hexa);
if (fgets(buf, sizeof(buf), stdin) == NULL)
{
free(hash);
return -1;
}
if (strncasecmp(buf, "yes", 3) != 0)
{
free(hash);
return -1;
}
if (ssh_write_knownhost(session) < 0)
{
fprintf(stderr, "Error %s\n", strerror(errno));
free(hash);
return -1;
}
break;
case SSH_SERVER_ERROR:
fprintf(stderr, "Error %s", ssh_get_error(session));
free(hash);
return -1;
}
free(hash);
return 0;
}
int main()
{
printf("LOG1");
int rc;
ssh_session my_ssh_session;
int verbosity = SSH_LOG_PROTOCOL;
int port = 22;
char password[20] = "abcde";
printf("LOG2");
my_ssh_session = ssh_new();
if(my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "255.255.255.255");
ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "root");
printf("LOG3");
rc = ssh_connect(my_ssh_session);
if(rc != SSH_OK)
{
fprintf(stderr, "Error connecting to localhost: %s\n",
ssh_get_error(my_ssh_session));
exit(-1);
}
//TODO:
// Verify the server's identity
if(verify_knownhost(my_ssh_session) < 0)
{
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
exit(-1);
}
// Authenticate ourselves
//password = getpass("Password: ");
rc = ssh_userauth_password(my_ssh_session, NULL, password);
if(rc != SSH_AUTH_SUCCESS)
{
fprintf(stderr, "Error authenticating with password: %s\n",
ssh_get_error(my_ssh_session));
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
exit(-1);
}
sftp_helloworld(my_ssh_session);
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
return 0;
}Forums:


댓글 달기