Problem while using Netsieben SSH with System (scp ) command - c++

I am facing some unique problem , not sure how to solve it . I am using the Netsiebin SSH C++ library for connecting with my server . It works perfectly well . I Connected to remote host using SSH2 protocol, with publickey authentication, sent come command to execute at the server too .
But the problem comes when I started using SCP or rsync "system( scp or rsync )in between .Its necessary for me to upload some files to server in between and then run Netseiben SSH function again to run that command file at server.But this never happen . Whenever I use some scp or rsync command and then execute some netseiben function it keeps on waiting and never returns .
Implementation sample:
Initialize Netseiben
Ne7SftpSubsystem _sftp;
ne7ssh *_ssh = new ne7ssh();
2.Connect with Key
channel1 = _ssh->connectWithKey ("serverAddress", 22, "userame", "pub key path");
3. Send command and read result
_ssh->send ("ls\n", channel1))
_ssh->waitFor (channel1, "$", 5)
result = _ssh->read (channel1); //read result
System function to put some file in server (Which i think is cause for all)
system( "rsync /home/user/Makefile user#server:~");
system( "scp /home/user/file.tgz user#server:~/new");// this Executes
Send come command to server (fails here ...This statement never executes)
ssh->send ("mkdir Tester\n", channel1)
If I dont have the above "system" function to execute some command it works fine .
Is it something to do with Port number . Because at the time of establishing connection I give port number 22
and if I am not wrong scp happens via port the same port which might cause problem . ot sure though
. Have been setting with this for a day . Thanks for your help .

Related

CURLE_UNSUPPORTED_PROTOCOL - ftp download fails

i use cURL (installed via vcpkg). Also openssl installed via vcpkg for a c++ project on VS 2019.
The problem:
CURLE_UNSUPPORTED_PROTOCOL = curl_easy_perform(curl);
I used this example:
https://curl.haxx.se/libcurl/c/ftpsget.html
with corrected connection and file data. The FTP server is filezilla. I checked the connection and file
download with filezilla client. All fine.
When i use the sample from link, i get the CURLE_UNSUPPORTED_PROTOCOL and in my FTP server i can't see
any connection try.
The error is described like this:
The URL you passed to libcurl used a protocol that this libcurl does not support..
Verbose information is:
* STATE: INIT => CONNECT handle 0x148090e0b38; line 1356 (connection #-5000)
* Protocol "ftp" not supported or disabled in libcurl
* Closing connection -1
* Expire cleared (transfer 0x148090e0b38)
I check the internet for the error message above and none of those i found solved my problem.
It seems not to be a format problem or problem related to wrong url .
So my question is, where can i enable this ? Do i need additional packages ? Or is the problem elsewhere ?
Many thanks
Mean while i figured out how to accomplish this using latest curl command line tool (version 7.68.0) on windows:
curl -u my_user:my_password --ftp-ssl ftp://my_ip/my_relative_path/my_file --insecure -o my_file
The file for download is on a server where a FileZilla FTP server is working. This server cyphers with a self created cert. The curl client only accepts this, when using flag:
--insecure
So far, i could not find the related options for my c++ curl. Perhaps it is not possible at all, because sources available through vcpkg are not (yet) up to date. But i want to stick with vcpkg. For me, this solutions: using command line tool instead, works fine.
One more hint, which is important: curl version 7.64.00 works NOT. You get error:
curl: (35) schannel: failed to receive handshake, SSL/TLS connection failed

Shell Script stops after connecting to external server

I am in the process of trying to automate deployment to an AWS Server as a cool project to do for my coding course. I'm using ShellScript to automate different processes but when connecting to the AWS E2 Ubuntu server. When connected to the server, it will not do any other shell command until I close the connection. IS there any way to have it continue sending commands while being connected?
read -p "Enter Key Name: " KEYNAME
read -p "Enter Server IP With Dashes: " IPWITHD
chmod 400 $KEYNAME.pem
ssh -i "$KEYNAME.pem" ubuntu#ec2-$IPWITHD.us-east-2.compute.amazonaws.com
ANYTHING HERE AND BELOW WILL NOT RUN UNTIL SERVER IS DISCONNECTED
A couple of basic points:
A shell script is a sequential set of commands for the shell to execute. It runs a program, waits for it to exit, and then runs the next one.
The ssh program connects to the server and tells it what to do. Once it exits, you are no longer connected to the server.
The instructions that you put in after ssh will only run when ssh exits. Those commands will then run on your local machine instead of the server you are sshed into.
So what you want to do instead is to run ssh and tell it to run a set of steps on the server, and then exit.
Look at man ssh. It says:
ssh destination [command]
If a command is specified, it is executed on the remote host instead of a login shell
So, to run a command like echo hi, you use ssh like this:
ssh -i "$KEYNAME.pem" ubuntu#ec2-$IPWITHD.us-east-2.compute.amazonaws.com "echo hi"
Or, for longer commands, use a bash heredoc:
ssh -i "$KEYNAME.pem" ubuntu#ec2-$IPWITHD.us-east-2.compute.amazonaws.com <<EOF
echo "this will execute on the server"
echo "so will this"
cat /etc/os-release
EOF
Or, put all those commands in a separate script and pipe it to ssh:
cat commands-to-execute-remotely.sh | ssh -i "$KEYNAME.pem" ubuntu#ec2-$IPWITHD.us-east-2.compute.amazonaws.com
Definitely read What is the cleanest way to ssh and run multiple commands in Bash? and its answers.

Connecting to MonetDB server on guest virtual machine from host

I have a virtual machine (centos 7) in VirtualBox on a RHEL 5 host running MonetDB5 (server v 11.19.9). I can connect to the database from with the guest through both jdbc and mclient. However, I cannot connect to it from the host.
I have port 50000 forwarded to port 5555, and have set shared=yes in monetdb and control=yes on monetdbd. When I try to connect using
java -jar jdbcclient.jar -dmydatabase -umonetdb -hlocalhost -p5555 -Xdebug
I type in my password and it waits a long time, then says:
Database connect failed: Unable to connect (localhost:5555): Connection to server lost!
The javaclient log file is unhelpful:
RD 1438806937222: server closed the connection (EOF)
The merovingian.log file is also unhelpful since nothing is added to it. Note that the mserver command in the log says --set-mapi_open=false, even though I have set sharing and control = yes. But I can't find the MonetDB.conf file so I don't know where to change "mapi_open=true." I tried making my own MonetDB.conf file and putting it in /etc/ but it doesn't seem to work there.
Note that I can connect to the machine with
ssh me#localhost -p222 -X
where I have forwarded port 20 to 222, so I feel good about the port forwarding. Any guidance would be greatly appreciated. Thanks!
The problem was with the firewall. Even though port 22 (ssh) was automatically opened on the guest machine, port 50000 needed to be configured manually.

C++ Windows Server - how to accept an SSH connection?

I have a server application i'm making specifically for windows. However the client that needs to connect to it was originally created towards a Linux server. The client connects through SSH and runs simple commands to execute bash scripts. I'd like to make my server work with this client without making any changes to the client.
So the client would usually SSH into the Linux server -> run command to execute bash -> bash script did stuff
I'd like the windows server to accept the SSH connection -> grab the command -> execute a function that does what the bash script would of done.
My question here is how can I make my server accept that SSH connection and get that command the client sends through?
Maybe these resources will help.
Set up a free SSH server on Windows 7 with freeSSHd
http://www.techrepublic.com/blog/tr-dojo/set-up-a-free-ssh-server-on-windows-7-with-freesshd/
OpenSSH for Windows
http://sshwindows.sourceforge.net/
MobaSSH: Free SSH server for Windows
http://mobassh.mobatek.net/

How to figure out why ssh session does not exit sometimes?

I have a C++ application that uses ssh to summon a connection to the server. I find that sometimes the ssh session is left lying around long after the command to summon the server has exited. Looking at the Centos4 man page for ssh I see the following:
The session terminates when the command or shell on the remote machine
exits and all X11 and TCP/IP connections have been closed. The exit
status of the remote program is returned as the exit status of ssh.
I see that the command has exited, so I imagine not all the X11 and TCP/IP connections have been closed. How can I figure out which of these ssh is waiting for so that I can fix my summon command's C++ application to clean up whatever is being left behind that keeps the ssh open.
I wonder why this failure only occurs some of the time and not on every invocation? It seems to occur approximately 50% of the time. What could my C++ application be leaving around to trigger this?
More background: The server is a daemon, when launched, it forks and the parent exits, leaving the child running. The client summons by using:
popen("ssh -n -o ConnectTimeout=300 user#host \"sererApp argsHere\""
" 2>&1 < /dev/null", "r")
Use libssh or libssh2, rather than calling popen(3) from C only to invoke ssh(1) which itself is another C program. If you want my personal experience, I'd say try libssh2 - I've used it in a C++ program and it works.
I find some hints here:
http://www.snailbook.com/faq/background-jobs.auto.html
This problem is usually due to a feature of the OpenSSH server. When writing an SSH server, you have to answer the question, "When should the server close the SSH connection?" The obvious answer might seem to be: close it when the server-side user program started by client request (shell or remote command) exits. However, it's actually a bit more complicated; this simple strategy allows a race condition which can cause data loss (see the explanation below). To avoid this problem, sshd instead waits until it encounters end-of-file (eof) on the pipes connecting to the stdout and stderr of the user program.
#sienkiew: If you really want to execute a command or script via ssh and exit, have a look at the daemontool of the libslack package. (Similar tools that can detach a command from its standard streams would be screen, tmux or detach.)
To inspect stdin, stdout & stderr of the command executed via ssh on the command line, you can, for example, use lsof.
# sample code to figure out why ssh session does not exit
# sleep keeps its stdout open, so sshd only sees EOF after command completion
ssh localhost 'sleep 10 &' # blocks
ssh localhost 'sleep 10 1>&- &' # does not block
ssh localhost 'sleep 10 & lsof -p ${!}'
ssh localhost 'sleep 10 1>&- & lsof -p ${!}'
ssh localhost 'sleep 10 1>/dev/null & lsof -p ${!}'
ssh localhost 'sleep 10 1>/dev/null 2>&1 & lsof -p ${!}'