Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
projects:openssh [2019/12/25 16:11] admin [Control flow] |
projects:openssh [2019/12/25 16:33] admin [On server] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== scp ====== | ====== scp ====== | ||
- | ===== Control flow ===== | + | |
- | - On client (copy remote to local case) | + | ==== 1) scp run on client (copy remote to local case) ==== |
* construct ''scp'' command to be executed on the server via ssh. append ''-v -r -p -d'' flags as appropriate. Resulting command stored in ''cmd'' variable | * construct ''scp'' command to be executed on the server via ssh. append ''-v -r -p -d'' flags as appropriate. Resulting command stored in ''cmd'' variable | ||
* call ''toremote()'' if destination is remote; ''tolocal()'' if destination is local (handles 'remote to local' and 'local to local' cases) | * call ''toremote()'' if destination is remote; ''tolocal()'' if destination is local (handles 'remote to local' and 'local to local' cases) | ||
* for 'remote to local' case, append '''-f <src>''' to ''scp'' command to be run on the server | * for 'remote to local' case, append '''-f <src>''' to ''scp'' command to be run on the server | ||
* call ''do_cmd()'' to run assembled ''scp'' command on the server | * call ''do_cmd()'' to run assembled ''scp'' command on the server | ||
- | * ''do_cmd()'' forks a child which executes (via ''execvp()'') "''ssh -p <port> -l <remuser> --- <host> <cmd>''" scp command on the server. Connect parent and child via pipes. ''do_cmd_pid'' contains child's PID. | + | * ''do_cmd()'' forks a child which executes (via ''execvp()'') "''ssh -p <port> -l <remuser> --- <host> <cmd>''" scp command on the server. Connect parent and child via pipes. Parent accesses child's pipes via ''remin'' & ''remout''. ''do_cmd_pid'' contains child's PID. |
- | - On server | + | * ''tolocal()->sink()'' receives file from child via ''remin'' & ''remout'' and stores it to the local destination |
+ | * finaly wait for child to finish, check for errors, close ''remin'' & ''remout'' and exit | ||
+ | ==== 3) server accepts ssh connection from client ==== | ||
* for ''-t'' or ''-f'' private flags: ''remin = stdin''; ''remout = stdout'' | * for ''-t'' or ''-f'' private flags: ''remin = stdin''; ''remout = stdout'' |