16 enum ssh_known_hosts_e state;
17 unsigned char *hash = NULL;
18 ssh_key srv_pubkey = NULL;
26 rc = ssh_get_server_publickey(session, &srv_pubkey);
31 rc = ssh_get_publickey_hash(srv_pubkey, SSH_PUBLICKEY_HASH_SHA1, &hash, &hlen);
32 ssh_key_free(srv_pubkey);
37 state = ssh_session_is_known_server(session);
39 case SSH_KNOWN_HOSTS_OK:
43 case SSH_KNOWN_HOSTS_CHANGED:
44 fprintf(stderr,
"Host key for server changed: it is now:\n");
46 fprintf(stderr,
"For security reasons, connection will be stopped\n");
47 ssh_clean_pubkey_hash(&hash);
50 case SSH_KNOWN_HOSTS_OTHER:
51 fprintf(stderr,
"The host key for this server was not found but an other type of key exists.\n");
52 fprintf(stderr,
"An attacker might change the default server key to confuse your client into thinking the key does not exist\n");
53 ssh_clean_pubkey_hash(&hash);
56 case SSH_KNOWN_HOSTS_NOT_FOUND:
57 fprintf(stderr,
"Could not find known host file.\n");
58 fprintf(stderr,
"If you accept the host key here, the file will be automatically created.\n");
61 case SSH_KNOWN_HOSTS_UNKNOWN:
62 hexa = ssh_get_hexa(hash, hlen);
63 fprintf(stderr,
"The server is unknown. Do you trust the host key?\n");
64 fprintf(stderr,
"Public key hash: %s\n", hexa);
65 ssh_string_free_char(hexa);
66 ssh_clean_pubkey_hash(&hash);
67 p = fgets(buf,
sizeof(buf), stdin);
72 cmp = strncasecmp(buf,
"yes", 3);
77 rc = ssh_session_update_known_hosts(session);
79 fprintf(stderr,
"Error %s\n", strerror(errno));
84 case SSH_KNOWN_HOSTS_ERROR:
85 fprintf(stderr,
"Error %s", ssh_get_error(session));
86 ssh_clean_pubkey_hash(&hash);
90 ssh_clean_pubkey_hash(&hash);
98 if((*ssh)->session == NULL){
100 ARC_DEBUG_ERR(
"ARC_Ssh_Create(ssh), ssh session could not be created\n");
107 ssh_options_set((*ssh)->session, SSH_OPTIONS_HOST, host);
111 ssh_options_set((*ssh)->session, SSH_OPTIONS_USER, user);
114 int32_t returnCode = ssh_connect((*ssh)->session);
115 if(returnCode != SSH_OK){
117 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_Create(ssh), ssh failed to connect to localhost: %s\n", ssh_get_error((*ssh)->session));
118 ssh_free((*ssh)->session);
126 ARC_DEBUG_ERR(
"ARC_Ssh_Create(ssh), ssh failed to verify knownhost\n");
127 ssh_disconnect((*ssh)->session);
128 ssh_free((*ssh)->session);
134 if(password == NULL){
135 returnCode = ssh_userauth_publickey_auto((*ssh)->session, NULL, NULL);
136 if(returnCode != SSH_AUTH_SUCCESS){
138 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_Create(ssh), ssh failed to authenticate with password: %s\n", ssh_get_error((*ssh)->session));
139 ssh_disconnect((*ssh)->session);
140 ssh_free((*ssh)->session);
145 ssh_send_ignore((*ssh)->session,
"mpv https://youtu.be/1P5BSm_oFJg --input-ipc-server=/tmp/mpvsocket --no-terminal & disown");
151 returnCode = ssh_userauth_password((*ssh)->session, NULL, password);
152 if(returnCode != SSH_AUTH_SUCCESS){
154 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_Create(ssh), ssh failed to authenticate with password: %s\n", ssh_get_error((*ssh)->session));
155 ssh_disconnect((*ssh)->session);
156 ssh_free((*ssh)->session);
175 channel = ssh_channel_new(ssh->
session);
178 ARC_DEBUG_ERR(
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed to create channel\n");
182 int32_t returnCode = ssh_channel_open_session(channel);
183 if(returnCode != SSH_OK){
184 ssh_channel_free(channel);
186 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed to open session with return code: %d\n", returnCode);
191 returnCode = ssh_channel_request_exec(channel,
"export DISPLAY=:0 ; volume --inc");
192 printf(
"return code: %d\n", returnCode);
194 ssh_channel_send_eof(channel);
195 ssh_channel_close(channel);
196 ssh_channel_free(channel);
201 channel = ssh_channel_new(ssh->
session);
204 ARC_DEBUG_ERR(
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed to create channel\n");
208 int32_t returnCode = ssh_channel_open_session(channel);
209 if(returnCode != SSH_OK){
210 ssh_channel_free(channel);
212 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed to open session with return code: %d\n", returnCode);
216 returnCode = ssh_channel_request_exec(channel, command);
217 if(returnCode != SSH_OK){
219 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed when executing command with error code: %d\n", returnCode);
222 ssh_channel_send_eof(channel);
223 ssh_channel_close(channel);
224 ssh_channel_free(channel);
229 channel = ssh_channel_new(ssh->
session);
232 ARC_DEBUG_ERR(
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed to create channel\n");
236 int32_t returnCode = ssh_channel_open_session(channel);
237 if(returnCode != SSH_OK){
238 ssh_channel_free(channel);
240 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed to open session with return code: %d\n", returnCode);
244 returnCode = ssh_channel_request_exec(channel, command);
245 if(returnCode != SSH_OK){
246 ssh_channel_close(channel);
247 ssh_channel_free(channel);
249 ARC_DEBUG_LOG(
arc_errno,
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed when executing command with error code: %d\n", returnCode);
259 bytesSize = ssh_channel_read(channel, buffer,
sizeof(buffer), 0);
260 while(bytesSize > 0){
261 if(returnString == NULL){
264 bytesSize = ssh_channel_read(channel, buffer,
sizeof(buffer), 0);
270 bytesSize = ssh_channel_read(channel, buffer,
sizeof(buffer), 0);
274 ssh_channel_close(channel);
275 ssh_channel_free(channel);
277 ARC_DEBUG_ERR(
"ARC_Ssh_RunInSession(ssh, sessionFn), ssh failed when reading bytes from channel\n");
279 if(returnString != NULL){
286 ssh_channel_send_eof(channel);
287 ssh_channel_close(channel);
288 ssh_channel_free(channel);