You are not logged in.
This is simplified version of a script I use to show differences between directory trees.
#!/bin/bash
# changes to go from $1 -> $2
src="$( find "$1" | sed "s!^$1!!" | sort )"
tgt="$( find "$2" | sed "s!^$2!!" | sort )"
lose="$( comm -23 <( echo "$src" ) <( echo "$tgt" ) | sed 's,^,- ,' )"
gain="$( comm -13 <( echo "$src" ) <( echo "$tgt" ) | sed 's,^,+ ,' )"
diff=''
while read file
do
[[ -z "$file" ]] && continue
diff -q "$1/$file" "$2/$file" &>/dev/null ||
{
[[ -z "$diff" ]] \
&& diff="x $file" \
|| diff="$( echo -e "$diff\nx $file" )"
}
done < <( comm -12 <( echo "$src" ) <( echo "$tgt" ) )
[[ -n "$lose" ]] && out="$lose"
[[ -n "$gain" ]] &&
{
[[ -z "$out" ]] \
&& out="$gain" \
|| out="$( echo -e "$out\n$gain" )"
}
[[ -n "$diff" ]] &&
{
[[ -z "$out" ]] \
&& out="$diff" \
|| out="$( echo -e "$out\n$diff" )"
}
echo "$out" | sort -k2
Edit: bug
Last edited by fsckd (2012-03-18 23:43:06)
aur S & M :: forum rules :: Community Ethos
Resources for Women, POC, LGBT*, and allies
Offline
[...]
I wanted to compare your script with the quick hack I've been using to compare my backups, however when attempting to use it I get quite a few errors:
My mistake, ran your script using sh instead of bash. (Thanks Karol.) Only problem now is comparing large directories takes far too long (due to 'diff -q'). It had run for 8 minutes so far before I stopped it.
At any rate, here's my very basic directory (top level) comparison function. I'm not sure how it relates to yours, but it's short and extremely fast.
dirdiff()
{
diff --suppress-common-lines -y <(cd "$1"; ls -aX1 | sort) <(cd "$2"; ls -aX1 | sort)
}
If I wanted to compare deeper down the directories I've got one using 'find' (-maxdepth) which requires some stream editing to remove the first few directories. (e.g. '/home/user/'<stuff> compared '/media/backups/home/'<stuff>). All ears if there's a better way or a method to strip those first few directories.
Last edited by Earnestly (2012-03-16 00:59:17)
Offline
@Kaustic
You should be running fsckd's script using bash ...
Offline
Here's a script I made for burning ogg files to audio cd from a Thunar Custom Action;
#!/bin/bash
# Script for converting, normalizing and burning ogg files, to audio cd.
# It is made as a Thunar custom action (uca) and is called from Thunar with 'scritpname %d'
# With modifications it can easily be used for other purposes.
# Requirements; vorbis-tools, mp3cd 1.027, thunar. mp3cd is called from another script, here called
# burnfromm3u
# Go thru the ogg-files and convert them
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
# set me
FILES="$1"/*.ogg
for f in $FILES
do
NAME=$(basename "$f" .ogg)
ogg123 -d wav -f "$NAME".wav "$f"
done
# Create M3U file list for mp3cd which also can be used for players
touch "${PWD##*/}WAV.m3u"
find -type f \( -iname '*.wav' -o -iname '*.WAV' \) | sort >> "${PWD##*/}WAV.m3u"
# Call mp3cd to do its magic
burnfromm3u "${PWD##*/}WAV.m3u"
exit 0
burnfromm3u;
#!/bin/bash
# this script can burn ogg, mp3 and flac files to audio cd using mp3cd from the AUR
# Usage 'scriptname filename.m3u' or in Thunar 'scriptname %f'
terminal --geometry=100x24 --hold -e "perl /usr/bin/site_perl/mp3cd -v -c \"--speed 8 --buffers 128\" -T -d /dev/sr0 '$@' "
exit 0
It will leave the created wav-files in the starting directory, which might be useful or not. mp3cd is supposed to do this directly but I never got it to work with ogg files without the above script. mp3cd 1.027 does however work for mp3 and flac as is.
mp3cd; https://aur.archlinux.org/packages.php?ID=35842 (check the PKGBUILD in the post for version 1.027)
Last edited by swanson (2012-03-16 05:38:45)
Offline
@Kaustic: Are you referring to something like -mindepth ? You can use -mindepth 1 -maxdepth 1 to restrict results to things exactly one directory deep.
If you mean so that if you pass d1/ and a/d2/ and want the paths d1/thing/file and a/d2/thing/file to be equal, what you have already works, since each find (or ls) should be relative to the path you cd too.
Do you really need the -X switch? You're passing the output to sort anyway, so I don't see how -X is doing any good.
Offline
@Kaustic: Are you referring to something like -mindepth ? You can use -mindepth 1 -maxdepth 1 to restrict results to things exactly one directory deep.
If you mean so that if you pass d1/ and a/d2/ and want the paths d1/thing/file and a/d2/thing/file to be equal, what you have already works, since each find (or ls) should be relative to the path you cd too.
Ah see, I'm being a bit deceptive. The ls variant works perfectly but it's restricted to one directory deep (?). I've made another which uses find with -maxdepth. It all works quite well except for one issue.
My home directory is: /home/earnest/ and my backup directory is /media/backup/home/. When using find (even if you cd first) it will include '/home/earnest/<thing_to_compare>' and '/media/backup/home/<thing_to_compare>'. The problem is when piping the contents to diff it will (correctly) see '/home/earnest...' and '/media/backup/home...' as different. A very bad workaround for this was to simply use sed to remove the offending directories (e.g. sed 's/\home\/earnest\///').
So my question was really if there was a better way to accomplish this.
(I've tried a for loop using basename, which is... interesting, lol. It works well enough but using a higher -maxdepth than 1 results in comedy.)
Do you really need the -X switch? You're passing the output to sort anyway, so I don't see how -X is doing any good.
Good call, I'm not sure why it was added but you're quite right, I don't need it. Thanks
Offline
@Kaustic This is from commandlinefu website, and it should do what you want as it cds to dir first, then does find on . so the path always starts ./foo. It's a bit of a mix between your two - I assume anyway.
diff --suppress-common-lines -y <(cd path-to-dir1; find .|sort) <(cd path-to-dir2; find .|sort)
I tries to run on current dir if the cd fails, so you could change the ; to && avoid that if you type the path wrong.
"...one cannot be angry when one looks at a penguin." - John Ruskin
"Life in general is a bit shit, and so too is the internet. And that's all there is." - scepticisle
Offline
@Kaustic This is from commandlinefu website, and it should do what you want as it cds to dir first, then does find on . so the path always starts ./foo. It's a bit of a mix between your two - I assume anyway.
diff --suppress-common-lines -y <(cd path-to-dir1; find .|sort) <(cd path-to-dir2; find .|sort)
I tries to run on current dir if the cd fails, so you could change the ; to && avoid that if you type the path wrong.
Perfect, all working now.
I was making the dumb mistake of <(cd "$1"; find "$1" | sort). -_-
ps: Bookmarked comandlinefu. Really nice site that I don't use often enough. Thanks again
Last edited by Earnestly (2012-03-16 14:25:06)
Offline
skanky wrote:@Kaustic This is from commandlinefu website, and it should do what you want as it cds to dir first, then does find on . so the path always starts ./foo. It's a bit of a mix between your two - I assume anyway.
diff --suppress-common-lines -y <(cd path-to-dir1; find .|sort) <(cd path-to-dir2; find .|sort)
I tries to run on current dir if the cd fails, so you could change the ; to && avoid that if you type the path wrong.
Perfect, all working now.
I was making the dumb mistake of <(cd "$1"; find "$1" | sort). -_-ps: Bookmarked comandlinefu. Really nice site that I don't use often enough. Thanks again
No worries, I saw it a while back and thought, that'll come in useful...but so far the only use I've had for it was to post it into this thread.
"...one cannot be angry when one looks at a penguin." - John Ruskin
"Life in general is a bit shit, and so too is the internet. And that's all there is." - scepticisle
Offline
(even if you cd first)
I'm glad you got this fixed; you can tell I thought you were already using find ./ by the way I said "since each find (or ls) should be relative to the path you cd to" so I probably wouldn't have been much help.
A very bad workaround for this was to simply use sed to remove the offending directories (e.g. sed 's/\home\/earnest\///').
Though it is still a bad workaround for this case, you should know that sed allows you to use other characters for the delimiter. For instance:
sed "s:^$1::"
to remove the contents of the first argument from the starts of the line (assuming $1 has no colons in it).
(I've tried a for loop using basename, which is... interesting, lol. It works well enough but using a higher -maxdepth than 1 results in comedy.)
This would make it check to make sure that somewhere in both the arguments there is a file named the same. Which, when going deeper into folders is probably not what you want.
Finally, I'll add for both Kaustic and fsckd's sake that diff can take directories as arguments.
Offline
sed "s:^$1::"
to remove the contents of the first argument from the starts of the line (assuming $1 has no colons in it).
That's quite clever, I should learn more about sed and regex, it's just so daunting
Finally, I'll add for both Kaustic and fsckd's sake that diff can take directories as arguments.
I'm aware of that, but it takes much, much longer rather than supplying diff with a simple stdin. (Which is what lead me on this goose-chase in the first place.)
edit: Sorry I didn't thank you for all your efforts and advice. Cheers
Last edited by Earnestly (2012-03-16 22:04:35)
Offline
Kaustic and jac made me find a better solution than sed or cd.
find "$1" -path "$1" -o -printf '%P\n'
-path "$1" - matches for the path searched and does nothing! that includes not printing the name
-o - this is the or operator, if the -path match fails, try the next test which is match on everything
-printf '%P\n' - here is the magic, this is the action part of match on anything, it prints the file name sans the "$1"
Kaustic, the difference between your script and mine is your's shows differences between the listings of two directory trees and mine shows if the objects in the two trees differ.
My script above, as I said, is a simplified version of the actual script I use. I removed extra things like counters, etc. and only left a framework for which one can add their own stuff. Here is an even more simplified version that eliminates that framework and may make it clearer as to what it's doing,
#!/bin/bash
src="$( find "$1" -path "$1" -o -printf '%P\n' | sort )"
tgt="$( find "$2" -path "$2" -o -printf '%P\n' | sort )"
cat <( comm -23 <( echo "$src" ) <( echo "$tgt" ) | sed 's,^,- ,' ) \
<( comm -13 <( echo "$src" ) <( echo "$tgt" ) | sed 's,^,+ ,' ) \
<( comm -12 <( echo "$src" ) <( echo "$tgt" ) |
parallel diff -q "$1/{}" "$2/{}" \&\>/dev/null \|\| echo "x {}" ) \
| sort -k2
Here's some sample output,
> bash dirtreediff2 /tmp/l /tmp/q
+ bar
x baz
+ baz/hi
- foo
> tree /tmp/{l,q}
/tmp/l
├── baz
├── foo
└── same
/tmp/q
├── bar
├── baz
│ └── hi
└── same
Note /tmp/l/baz is a file.
aur S & M :: forum rules :: Community Ethos
Resources for Women, POC, LGBT*, and allies
Offline
Writing a script comparing 3 or more directory trees will be left as an exercise for the reader.
Offline
There are a few C functions that I wish were commands:
daemon.c:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
if(argv[1] == NULL) {
return 1;
}
daemon(1, 0);
execvp(argv[1], argv + 1);
return 0;
}
Last edited by Nichollan (2012-03-21 09:30:59)
Offline
alias xyzzy='if (( $(date +%s)%42==0 )); then echo "Twice as much happens"; else echo "Nothing happens"; fi;'
Offline
I have this in ~/bin/alsamixer (first in the PATH) to avoid remember strange keyboard keys (my keymap is FR and my keyboard is azerty) to increase/decrease left/right/both channel with the same mnemonic as US keyboard.
You can also control left & right levels for the current channel independently, as follows:
[Q | W | E ] -- turn UP [ left | both | right ]
[Z | X | C ] -- turn DOWN [ left | both | right ]
#!/bin/bash
# map q,w,e and z,x,c at the same place as an US qwerty keyboard for azerty ones for alsamixer
reset() {
xmodmap -e "keycode 24 = a"
xmodmap -e "keycode 25 = z"
xmodmap -e "keycode 52 = w"
}
xmodmap -e "keycode 24 = q"
xmodmap -e "keycode 25 = w"
xmodmap -e "keycode 52 = z"
trap 'reset' 0 1 2 3 15
/usr/bin/alsamixer -D hw:0 "$@"
Offline
Todo lists the KISS way:
ndt.sh (inspired by Now Do This)
#!/bin/sh
file=${NDT_FILE:-~/todo}
case $1 in
(".") sed -i 1d $file ;;
("") sed 1q $file ;;
(*) echo "$@" >> $file ;;
esac
Now add your own aliases:
alias h='NDT_FILE=~/home ndt'
alias o='NDT_FILE=~/office ndt'
Usage:
~ $ h Feed the cat
~ $ h Buy the moon
~ $ h
Feed the cat
~ $ h .
~ $ h
Buy the moon
Oh, and if you want to keep a diary, look no further:
#!/bin/sh
${EDITOR:-vi} ~/diary/$(date +"%Y-%m-%d").txt
Offline
There are many iptables scripts out there, but most are written as an example. This one is meant more as a "yes or no" script, asking whether or not to enable specific ports.
I wrote this for one of my friend so he could adjust to Linux and the command line basics before actually attempting iptables on his own.
This script includes some common ports. I am willing to accept feedback on what additional ports to enable, just remember that the goal is to include ports relevant to most people in the Linux world, rather than ports that Linux users rarely use. I'll edit this post as needed to add the additional ports.
#!/bin/bash
# simple iptables configuration script
# Changelog:
# V0.1 [24 Mar 2012]: Initial Version
# v0.2 [31 Mar 2012]: (1) [FIX] Fixed a variable
# (2) [FIX] Fixed some typos/grammar in the output
# (3) [FIX] Removed a few commands that iptables didn't recognize
# (4) [IMPROVE] Rearranged a few commands for consistency when editing
# (5) [IMPORVE] Added in NTP
# v0.3 [11 Apr 2012] (1) [IMPROVE] Added outgoing ping
# (2) [IMPROVE] Rewrite some of the output
# v0.4 [27 May 2012] (1) [IMPROVE] Rearrange/shorten output
# (2) [IMPROVE] Added AIM/ICQ port
# (3) [IMPROVE] Added MSN/Windows Live Messenger port
# v0.5 [28 May 2012] (1) [FIX] Add the command needed to enable MSN/WLM
# Author: Kris "Piki" < no public email >
# Alt contact: Freenode IRC (chat.freenode.net) nicks: Piki Piki| Piki|1
# ^I'm on sporadically during daylight hours Eastern Time
bold=`tput bold`
normal=`tput sgr0`
echo
echo "${bold}Make sure you are logged in as root.${normal}"
echo "Alternatively, you may use sudo."
echo
echo "This script will ask you whether or not to allow some common ports."
echo "As a rule of thumb, ${bold}never${normal} allow more ports than you need. Open ports are how hackers get in!"
echo "It's always a good idea to allow DNS, normal HTTP (web browsing), and secure HTTP."
echo
echo "Type either yes or the letter y in ${bold}lower case${normal}. Anything else and this script will assume no."
echo
echo "Allow DNS lookups? (port 53, TCP and UDP)"
read dns
echo
echo "Allow outgoing ping requests?"
read ping
echo
echo "Allow normal HTTP? (port 80, TCP)"
read http
echo
echo "Allow secure HTTP? (port 443, TCP)"
read https
echo
echo "Allow alternate HTTP? (port 8080, TCP)"
read http_alt
echo "Allow NTP? (port 123, UDP)"
read ntp
echo
echo "Allow normal IMAP? (port 143, TCP)?"
read imap
echo
echo "Allow secure IMAP? (port 993, TCP)?"
read imaps
echo
echo "Allow normal POP3? (port 110, TCP)?"
read pop3
echo
echo "Allow secure POP3? (port 995, TCP)?"
read pop3s
echo
echo "Allow normal SMTP? (port 25, TCP) (some ISPs may block port 25, try 587 or 465)"
read smtp
echo
echo "Allow secure SMTP? (port 587, TCP)"
read smtps
echo
echo "Allow alternate secure SMTP? (port 465, TCP)"
read smtps_alt
echo
echo "Allow AIM/ICQ? (port 5190, TCP and UDP)"?
read aim
echo
echo "Allow MSN/Windows Live Messenger? (port 1863, TCP) (you also need HTTP and secure HTTP enabled)"
read msn
echo
echo "Allow IRC? (port 6667, TCP) (very few IRC networks use a different port)"
read irc
echo
echo "Allow secure IRC? (port 669,TCP)"
read irc_ssl
echo
echo "Allow Jabber/XMPP? (port 5222, TCP) (needed for GTalk)"
read xmpp
echo
echo "Allow alternate Jabber/XMPP? (port 5223, TCP) (rarely used any more)"
read xmpp_alt
echo
echo "Allow ssh to another computer? (port 22, TCP)"
read ssh_out
echo
echo "Allow ssh to this computer? (port 22, TCP)"
read ssh_in
echo
echo "Allow regular torrent ports? (6881-6887, TCP and UDP)"
read torrent
echo
echo "Allow extra torrent ports? (6888-6999, TCP and UDP)"
read torrent_extra
echo
echo "Clearing all existing iptables rules..."
iptables -F OUTPUT
iptables -F INPUT
iptables -F FORWARD
iptables -F -t nat
iptables -F
iptables -X -t nat
iptables -X
iptables -Z OUTPUT
iptables -Z INPUT
iptables -Z FORWARD
iptables -Z -t nat
iptables -Z
echo
echo "Drop all communication, unless explicitly allowed..."
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
echo
echo "Automtically drop invalid packets..."
iptables -A OUTPUT -p ALL -m state --state INVALID -j DROP
iptables -A INPUT -p ALL -m state --state INVALID -j DROP
iptables -A FORWARD -p ALL -m state --state INVALID -j DROP
echo
echo "Allow unlimited communications on loopback (needed for some local applications)..."
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
if [ "$dns" == "y" -o "$dns" == "yes" ]; then
echo
echo "Allowing port 53 for DNS lookups..."
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED --sport 53 -j ACCEPT
fi
if [ "$ping" == "y" -o "$ping" == "yes" ]; then
echo
echo "Allow outgoing ping requests..."
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
fi
if [ "$http" == "y" -o "$http" == "yes" ]; then
echo
echo "Allowing port 80 for web browsing..."
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 80 -j ACCEPT
fi
if [ "$https" == "y" -o "$https" == "yes" ]; then
echo
echo "Allowing port 443 for secure web browsing..."
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 443 -j ACCEPT
fi
if [ "$http_alt" == "y" -o "$http_alt" == "yes" ]; then
echo
echo "Allowing alternate port 8080 for web browsing..."
iptables -A OUTPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 8080 -j ACCEPT
fi
if [ "$ntp" == "y" -o "$ntp" == "yes" ]; then
echo
echo "Allowing port 123 for NTP..."
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED --sport 123 -j ACCEPT
fi
if [ "$imap" == "y" -o "$imap" == "yes" ]; then
echo
echo "Allowing port 143 for IMAP access..."
iptables -A OUTPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 143 -j ACCEPT
fi
if [ "$imaps" == "y" -o "$imaps" == "yes" ]; then
echo
echo "Allowing port 993 for secure IMAP access..."
iptables -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 993 -j ACCEPT
fi
if [ "$smtp" == "y" -o "$smtp" == "yes" ]; then
echo
echo "Allowing port 25 for SMTP access..."
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 25 -j ACCEPT
fi
if [ "$smtps" == "y" -o "$smtps" == "yes" ]; then
echo
echo "Allowing port 587 for secure SMTP access..."
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 587 -j ACCEPT
fi
if [ "$smtps_alt" == "y" -o "$smtps_alt" == "yes" ]; then
echo
echo "Allowing alternate port 465 for (secure) SMTP access..."
iptables -A OUTPUT -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 465 -j ACCEPT
fi
if [ "$aim" == "y" -o "$aim" == "yes" ]; then
echo
echo "Allowing port 5190 for AIM and ICQ access..."
iptables -A OUTPUT -p tcp --dport 5190 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 5190 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5190 -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED --sport 5190 -j ACCEPT
fi
if [ "$msn" == "y" -o "$msn" == "yes" ]; then
echo
echo "Allowing port 1863 for MSN/Windows Live Messnger access..."
iptables -A OUTPUT -p tcp --dport 1863 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 1863
fi
if [ "$irc" == "y" -o "$irc" == "yes" ]; then
echo
echo "Allowing port 6667 for IRC access..."
iptables -A OUTPUT -p tcp --dport 6667 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 6667
fi
if [ "$irc_ssl" == "y" -o "$irc_ssl" == "yes" ]; then
echo
echo "Allowing port 6697 for secure IRC access..."
iptables -A OUTPUT -p tcp --dport 6697 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 6697
fi
if [ "$xmpp" == "y" -o "$xmpp" == "yes" ]; then
echo
echo "Allowing port 5222 for Jabber/XMPP access..."
iptables -A OUTPUT -p tcp --dport 5222 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 5222 -j ACCEPT
fi
if [ "$xmpp_alt" == "y" -o "$xmpp_alt" == "yes" ]; then
echo
echo "Allowing alternative port 5223 for Jabber/XMPP access..."
iptables -A OUTPUT -p tcp --dport 5223 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 5223 -j ACCEPT
fi
if [ "$ssh" == "y" -o "$ssh" == "yes" ]; then
echo
echo "Allowing port 22 for outgoing ssh access..."
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 22 -j ACCEPT
fi
if [ "$ssh" == "y" -o "$ssh" == "yes" ]; then
echo
echo "Allowing port 22 for incoming ssh access..."
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
fi
if [ "$torrent" == "y" -o "$torrent" == "yes" ]; then
echo
echo "Allowing ports 6881 through 6887 for BitTorrent..."
iptables -A OUTPUT -p tcp --dport 6881:6887 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 6881:6887 -j ACCEPT
iptables -A OUTPUT -p udp --dport 6881:6887 -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED --sport 6881:6887 -j ACCEPT
fi
if [ "$torrent_extra" == "y" -o "$torrent_extra" == "yes" ]; then
echo
echo "Allowing extra ports 6888 through 6999 for BitTorrent access..."
iptables -A OUTPUT -p tcp --dport 6888:6999 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --sport 6888:6999 -j ACCEPT
iptables -A OUTPUT -p udp --dport 6888:6999 -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED --sport 6888:6999 -j ACCEPT
fi
echo
echo
echo "DONE!"
echo
echo
echo "If it didn't work, double check that you are logged in as root, or using sudo."
echo "Also make sure iptables is installed. Some distros don't install it by default."
echo
echo
echo "Just a reminder that if you need more ports, you can edit this script in your"
echo "favorite text editor to add them, using the other lines as an example."
echo "Alternative, you may manually run the iptables commands."
Last edited by Piki (2012-05-28 22:25:34)
--
Piki
"Many people have died for their beliefs. The real courage is in living and suffering for what you believe in." Brom, character in 'Eragon' by Christopher Paolini
Offline
I have plenty of scripts of all kinds :
$ find ~/bin /home/sputnick/repository/{awk,bash,C,greasemonkey,java,javascript,perl,php,prolog,python,ruby,sikuli,windows} -type f | wc -l
2900
If I search only scripts signed by myself :
$ find ~/bin /home/sputnick/repository/{awk,bash,C,greasemonkey,java,javascript,perl,php,prolog,python,ruby,sikuli,windows} -type f -exec bash -c '
grep -q sputnick "$1" && echo ok
' -- {} \; |
wc -l
542
(some scripts are not my own and some are just a few lines without any signature )
The followings scripts are a kind of best off :
google-translate: translate with google for free (use it at your own risk, that probably breaks google TOS). Usefull combined with xclip (X clipboard tools) + zenity and a keyboard combo (I use windows+l to translate English -> French and windows+shift+l to translate French->English) : you just have to select something anywhere and call the script to displays a graphic zenity translated text box.
Usage:
./google_translate.py <OPTS>
-h | --help this help
-f <from> | --from <from> original language
-t <to> | --to <to> destination language
-w <text> | --words <text> text
-v | --version google_translate version
Example:
./google_translate.py -f en -t fr -w "A grey hat"
See http://tinyurl.com/73xljez for all supported languages
See https://github.com/sputnick-dev/google_translate
PacDiff: A pacnew/pacsave bash script that helps to do changes with vimdiff and asking to remove .pac* file if the target file is modified :
#!/bin/bash
# 2012-03-25 03:02:30.0 +0200 / sputnick <gilles <DOT> quenot <AT> gmail>
for file in $(find /boot /etc /var -name '*.pacnew' -o -name '*.pacsave'); do
sha1=$(sha1sum "${file%.pac*}" | cut -d' ' -f1)
vimdiff "$file" "${file%.pac*}"
newsha1=$(sha1sum "${file%.pac*}" | cut -d' ' -f1)
if [[ $sha1 != $newsha1 ]]; then
read -p "rm -f $file ? >>> "
[[ $REPLY == [oOyY]* ]] && rm -f "$file"
fi
done
TwinSwitch: switch twinview between one or 2 nvidia screens (adapt to your needs)
#!/bin/bash
case $(xrandr | grep "^default" | cut -d" " -f3) in
1440*) disper -e -t right ;;
2880*) disper -s ;;
esac 2> >(egrep -v 'unrecognised scaling value|Failed to get size of gamma for output default')
TinyUrl: tinyfy an URL with goo.gl web site API. Uses zenity or CLI mode depending of the context. Usefull with a keyboard combo (I use win+t "t" like tinify), the script search and feed the X clipboard.
(requires curl, xclip, zenity, libnotify)
#!/bin/bash
# 2012-03-20 15:33:55.0 +0100 / sputnick <gilles <DOT> quenot <AT> gmail>
DISPLAY=:0
# are we in a terminal or no ?
if [[ -t 0 ]]; then
curl -s -d "url=$1" http://goo.gl/api/url | grep -oP 'short_url":"\Khttp://goo.gl/\w+'
else
url=$(xclip -o)
if [[ $url != http* ]]; then
zenity --error --text "URL must starts with http*"
exit 1
fi
out=$(curl -s -d "url=$url" http://goo.gl/api/url | grep -oP 'short_url":"\Khttp://goo.gl/\w+')
printf '%s' $out | xclip
notify-send "$out is in the clipboard..."
fi
screencast: takes a screencast in your selected area in a defined format (mkv here). The file name will be typed in the terminal to save time. The first optional argument is the sleep time before beginning. Type "q" to stop recording.
requires xvkbd, ffmpeg, imagemagick
#!/bin/bash
# 2012-03-14 15:33:55.0 +0100 / sputnick <gilles <DOT> quenot <AT> gmail>
# inspired by screencastor
player=mplayer
codec=libx264 # libx264 = mkv
frames_in=30
frames_out=25
threads=0 # 0 = auto detectection
# select X area until false
until [[ ${infos[6]} =~ ^[[:digit:]]+$ || ${infos[7]} =~ ^[[:digit:]]+$ ]]; do
infos=$(import -identify /dev/null) infos=${infos//x/ } infos=(${infos//+/ })
done
((${infos[2]} % 2)) && largeur=$((${infos[2]} + 1)) || largeur=${infos[2]}
((${infos[3]} % 2)) && hauteur=$((${infos[3]} + 1)) || hauteur=${infos[3]}
res="${largeur}x${hauteur}"
pos="${infos[6]},${infos[7]}"
file=/tmp/out_$(date +%Y%m%d%H%M%S.mkv)
sleep ${1:-2}
# ffmpeg [input options] -i [input file] [output options] [output file]
ffmpeg -f x11grab -r $frames_in -s "$res" -i "$DISPLAY+$pos" -vcodec $codec -preset ultrafast -crf 0 -threads $threads -g "250" -keyint_min "25" -trellis "1" -r $frames_out $file
echo $file
# type the file on the terminal to save your time ;)
{ xvkbd -xsendevent -text "$player $file"; } 2> >(grep -Ev 'Warning:|xvkbd:')
AlsaChecklist: my interactive checklist if sound "doesn't work". The checklist is the same as the #alsa IRC channel on freenode network.
#!/bin/bash
amixer set 'Master',0 90%,90% unmute
amixer set 'PCM',0 90%,90% unmute
amixer set 'Front',0 90%,90% unmute
cat <<-EOF
1) run alsaconf as root
2) add yourself to the 'audio' group (log out and log in again)
3) use alsamixer and unmute channels and raise levels (also try muting some channels) ( amixer set 'Front',0 90%,90% unmute )
4) arts or esound stopped?
5) OSS modules unloaded?
6) speakers on?
7) modprobe snd-pcm-oss
8) does "aplay /usr/share/sounds/alsa/Noise.wav" work for root? Test your sound with aplay and a wav so codec issues don't confuse the situation. <list alsa users>
EOF
coin.bash: a bash joke, that displays a duck and use sounds right from the script itself (ctrl+c to quit ). This is inspired by makeself command (nvidia use that by example to share drivers)
http://www.sputnick-area.net/scripts/coin.bash
Last edited by sputnick (2012-03-25 10:12:52)
Offline
^ The google_translate script is great! Thanks a bunch
Offline
c opens configs. It will open itself if asked to do the impossible.
#! /bin/sh
# opens configs, omits needless thinking
E="vim"
case "$1" in
dwm) $E ~/dwm/config.h;;
mpd) $E ~/.mpd/mpd.conf;;
ncmpcpp) $E ~/.ncmpcpp/config;;
ranger) $E ~/.config/ranger;;
*) $E $0
esac
Offline
I'd like to post yet another weather script, that utilizes the Google API and xmllint to parse Xpath out of the response. You also need PHP which is needed to URL-encode the location.
#!/bin/bash
lang="de"
location="new york"
location=`php -r "echo rawurlencode('$location');"`
tmp=`mktemp`
curl -s "http://www.google.com/ig/api?weather=$location&hl=$lang" > $tmp
recode latin1..UTF-8 $tmp
c=`xmllint --xpath "string(//current_conditions/condition/@data)" $tmp`
t=`xmllint --xpath "string(//current_conditions/temp_c/@data)" $tmp`
echo "$t °C, $c" > ~/.weather
You may edit location and lang to your needs.
I let cron run this script every 10 minutes (to prevent request excess) and then display the ~/.weather via conky.
Offline
@i_love_penguins, better use perl instead of php while it's most installed.
perl -pe 's/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg' <<< 'http://google.com/script.php?foo=bar&po=555'
http%3A%2F%2Fgoogle%2Ecom%2Fscript%2Ephp%3Ffoo%3Dbar%26po%3D555%0A
or simply use the
--data-urlencode
curl option
Offline
Here is a version of google-translate, which uses Arch standard Python (Python 3.2) and only the standardlib. No third party packages needed.
See https://bitbucket.org/whitie/container/ … /gtrans.py
Whitie
Last edited by whitie (2012-03-26 18:03:21)
Offline