I want to excecute the following command over a ssh connection:  tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) &amp;&amp; top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'    This command is working on my target machine.  Now I want to use this command from a different machine and execute it via ssh, so what I have done is this:  ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) &amp;&amp; top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'    The result is    cat: /var/run/jboss-as/jboss-as-standalone8.pid: No such file or directory Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information.   Whats wrong with my call?
123071
I have the following in a script  for server in ${servers[@]}; do     echo ${server}     ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done" done   But it doesn't work. Weird thing, I see $I amount of return lines. So if I have ten files, I see ten blank lines.
17891
How do I execute the following shell command using the Python  module?  echo "input data" | awk -f script.awk | sort &gt; outfile.txt   The input data will come from a string, so I don't actually need echo.  I've got this far, can anyone explain how I get it to pipe through sort too?  p_awk = subprocess.Popen(["awk","-f","script.awk"],                           stdin=subprocess.PIPE,                           stdout=file("outfile.txt", "w")) p_awk.communicate( "input data" )   UPDATE:  Note that while the accepted answer below doesn't actually answer the question as asked, I believe S.Lott is right and it's better to avoid having to solve that problem in the first place!
103180
I have a server log that outputs a specific line of text into its log file when the server is up. I want to execute a command once the server is up, and hence do something like the following:  tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?   What is the best way to do this?
20785
I don’t actually need to run the command below, and I am aware of ssh keys if I did want to log in without typing a password. I would just like to know how ssh seems to circumvent my file redirection.  Running the following command, ssh prompts me for a password:  ssh nobody@192.168.1.151 &gt; /dev/null 2&gt; /dev/null &lt; /dev/null   How does this work? stdin, stdout, and stderr are all redirected, but ssh still manages to print a prompt on my screen and read what I type. I tried adding the ssh arguments -t -t and -T (not both at once), to enable or disable pseudo-tty allocation, but it made no difference.  I also tried closing all input and output this way, although I don’t know if I typed it correctly. Still, ssh prompts for a password:  (exec 0&lt;&amp;- 1&lt;&amp;- 2&lt;&amp;- 0&gt;&amp;- 1&gt;&amp;- 2&gt;&amp;-; ssh nobody@192.168.1.151)
37477
There're way too many articles/resources on the web that teaches people HOW to set the environment variable PATH so that they can use the short hand of java or python etc instead of the absolute path in command line interface.  What I'm interested to know is that what's behind the scene when we type in the command and hit enter (similar to ).  Here is my guess:   read the command (parse/preprocess stdin to get the right arguments $@) command lookup command execution (program started, consume memory, stdout/stderr to shell) re-render the emulator by relevant environment variables (e.g. $PS#, $PROMPT, etc)   The part I want to figure out most is the command lookup. Obviously, the $PATH is consumed by some background function and separated by : / ;as delimiters, then what happened? Do we use a hash table (key: basename of the file, value: absolute dirname of the file) to store the binary files under those PATHs, or some other hooks?   NOTE: I originally thought it was hash table as I can use [ -z hash [command] ] to check if a command is available in current env, but when I use hash | grep python I get nothing from the output while which python works as anticipated. (I think the mechanism might be shell specific, but I want to get more insights into it.)
82945
I have an already established ssh connection between two machines.    Is there a way to send commands to the remote machine from a shell script that is run on the local machine, using the already open connection, and without starting another ssh session?
79110
I am trying to write a bash script in a file that would, when run start pinging a host until it becomes available, when the host becomes reachable it runs a command and stops executing, I tried writing one but the script continues pinging until the count ends,  Plus I need to put that process in the background but if I run the script with the dollar ($) sign it still runs in foreground,  #!/bin/bash ping -c30 -i3 192.168.137.163 if [ $? -eq 0 ] then /root/scripts/test1.sh exit 0 else echo “fail” fi
100076
I'm trying to write a simple script to retrieve mem and swap usage from a list of hosts. Currently the only way I've been able to achieve this is to write 3 seperate scripts:  for a in {1..9}; do echo "bvrprdsve00$a; $(ssh -q bvrprdsve00$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done &gt; /tmp/svemem.txt; for a in {10..99}; do echo "bvrprdsve0$a; $(ssh -q bvrprdsve0$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done &gt;&gt; /tmp/svemem.txt; for a in {100..218}; do echo "bvrprdsve$a; $(ssh -q bvrprdsve$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done &gt;&gt; /tmp/svemem.txt   The reason for this is that the hostname always ends in a 3 digit number and these hosts go from 001-218 so I've needed to do a different for loop for each set (001-009, 010-099, 100-218). Is there a way in which I can do this in one script instead of joining 3 together?
26277
I run the following line from my bash script in order to run the script /usr/run.pl on remote machines    xargs -P "$numprocs" -I '{}' -n  1 -- perl -e 'alarm shift; exec @ARGV' -- "$timeout" ssh -nxaq -o ConnectTimeout=5 -o StrictHostKeyChecking=no '{}' /usr/run.sh &lt; &lt;(echo -e "$node")    but I get on the console the following standard output   Connection to 143.6.22.4 closed by remote host.  xargs: perl: exited with status 255; aborting   where I need to put the 1>/dev/null in my syntax to avoid this message?
63786
I'm using a GNU/Linux system remotely, via SSH.  I mistakenly added something into my $HOME/.bash_profile scriot which causes an error. (To be specific: I added an exec foo command instead of . foo, applied to another bash script without execution permissions, which results in an error.)   Now I can't seem to SSH, SCP or SFTP into my machine: bash, my login shell, tries to run the exec foo command, gets the error and throws me out! I don't have any other account I can access remotely.  Is there something I can do to restore access to the system?  Additional details:   Most ports other than for SSH are unavailable since the machine is behind a firewall. It's a Devuan 3 ASCII (~= Debian 10 Beowulf) system.
723
I am trying to understand how exactly Bash treats the following line:  $(&lt; "$FILE")   According to the Bash man page, this is equivalent to:  $(cat "$FILE")   and I can follow the line of reasoning for this second line. Bash performs variable expansion on $FILE, enters command substitution, passes the value of $FILE to cat, cat outputs the contents of $FILE to standard output, command substitution finishes by replacing the entire line with the standard output resulting from the command inside, and Bash attempts to execute it like a simple command.  However, for the first line I mentioned above, I understand it as: Bash performs variable substitution on $FILE, Bash opens $FILE for reading on standard input, somehow standard input is copied to standard output, command substitution finishes, and Bash attempts to execute the resulting standard output.  Can someone please explain to me how the contents of $FILE goes from stdin to stdout?
97141
I have a script file ./run_app.sh which contains of the following:  ssh -L 8888:localhost:8888 ubuntu@address ./run_website.sh   # it should be executed locally   but it tries to run the second line on the remote machine. Actually, I want to run it on my pc. Any idea?
114314
The below command works in command line  rsync -avh -r /Source/09_03_2016/ /Destination/ echo $(basename !:3)      Output 09_03_2016   But when I do this in shell script it does not work  #! /bin/bash  /usr/bin/rsync -avh -r /Source/09_03_2016 /Destination/; echo $(basename !:3)      Output  !:3
26823
I've hacked on a lot of shell scripts, and sometimes the simplest things baffle me. Today I ran across a script that made extensive use of the : (colon) bash builtin.  The  seems simple enough:   : (a colon)        : [arguments]         Do nothing beyond expanding arguments and performing redirections. The return status is zero.    However I have previously only seen this used in demonstrations of shell expansion. The use case in the script I ran across made extensive use of this structure:  if [ -f ${file} ]; then     grep some_string ${file} &gt;&gt; otherfile || :     grep other_string ${file} &gt;&gt; otherfile || : fi   There were actually hundreds of greps, but they are just more of the same. No input/output redirects are present other than  the simple structure above. No return values are checked later in the script.  I am reading this as a useless construct that says "or do nothing". What purpose could ending these greps with "or do nothing" serve? In what case would this construct cause a different outcome than simply leaving off the || : from all instances?
26896
I use ps -ef | grep catalina | grep -v grep to print the tomcat process running on the system:  kshitiz   7099     1  0 May11 ?        00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start   Then I use ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}' to extract the process id:  7099   But when I alias the whole command alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'" and use it via alias, it prints the whole text and awk doesn't seem to work.  type tomcat_id gives:  tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
27138
Is it possible to do this:  ssh user@socket command /path/to/file/on/local/machine   That is to say, I want to execute a remote command using a local file in one step, without first using scp to copy the file.
54667
I just wanted to ask whether there is any command which would work on common shells (bash, dash, kornshell)? It is supposed to check if the line variable contains any part of the path.  if [[ $line =~ "$PWD"$ ]] ;then