[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: advanced scripting problems - or wrong approach?



Am 02.06.2024 um 02:41 schrieb DdB:
> Will share my findings, once i made more progress...

Here is what i've got before utilizing it:


> datakanja@PBuster-NFox:/mnt/tmp$ cat test 
> #!/bin/bash -e
> # testing usefulness of coprocess to control host and backup machine from a single script.
> # beware: do not use subprocesses or pipes, as that will confuse the pipes setup by coproc!
> # At this point, this interface may not be very flexible
> # but trying to follow best practices for using coproc in bash scripts
> # todo (deferred): how to handle stderr inside coproc?
> # todo (deferred): what, if coproc dies unexpectedly?
> 
> 	# setting up the coprocess:
> 	stdout_to_ssh_stdin=5 # arbitrary choice outside the range of used file desciptors
> 	stdin_from_ssh_stdout=6
> 
> 	coproc SSH { bash; } # for testing purposes, i refrain from really involving ssh just yet and replace it with bash:
> 
> 	# save filedescriptors by duplicating them:
> 	eval "exec ${stdin_from_ssh_stdout}<&${SSH[0]} ${stdout_to_ssh_stdin}>&${SSH[1]}"
> 	echo The PID of the coproc is: $SSH_PID # possibly useful for inspection
> 
> unique_eof_delimirer="<EOF>"
> line=""
> # collect the output available and print it locally (synchonous):
> function print-immediate-output () {
> 	while IFS= read -r -u "${stdin_from_ssh_stdout}" line
> 	do
> 	    if [[ "${line:0-5:5}" == "$unique_eof_delimirer" ]] # currently, the length is fixed
> 	    then
> 		line="${line%<EOF>}"
> 		if [[ ! -z $line ]]
> 		then
> 		    printf '%s\n' "$line"
> 		fi
> 		break
> 	    fi 
> 	    printf '%s\n' "$line"
> 	done
> }
> 
> # send a single command via ssh and print output locally
> function send-single-ssh-command () {
> 	printf '%s\n' "$@" >&"${stdout_to_ssh_stdin}"
> 	printf '%s\n' "echo '"$unique_eof_delimirer"'" >&"${stdout_to_ssh_stdin}"
> 	print-immediate-output
> }
> 
> 
> send-single-ssh-command "find . -maxdepth 1 -name [a-z]\*" # more or less a standard command, that succeeds
> send-single-ssh-command "ls nothin" # more or less a standard command, that fails
> 
> 	# tearing down the coprocess:
> 	printf "%s\n" "exit" >&"${stdout_to_ssh_stdin}" # not interested in any more output (probably none)
> 	wait
> 	# Descriptors must be closed to prevent leaking.
> 	eval "exec ${stdin_from_ssh_stdout}<&- ${stdout_to_ssh_stdin}>-"
> 
> 	echo "waited for the coproc to end gracefully, done"
> 
> datakanja@PBuster-NFox:/mnt/tmp$ ./test
> The PID of the coproc is: 28154
> ./test
> ./out
> ls: Zugriff auf 'nothin' nicht möglich: Datei oder Verzeichnis nicht gefunden
> waited for the coproc to end gracefully, done
> datakanja@PBuster-NFox:/mnt/tmp$ 


Reply to: