diff --git a/README.html b/README.html index 6e3c304..5d6dcec 100644 --- a/README.html +++ b/README.html @@ -85,10 +85,11 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni

Bashbot - A Telegram bot written in bash.

-Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M (@gnadelwartz). +Written by Drew (@topkecleon) and Kay M (@gnadelwartz). -

Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1.

+

Contributions by Daniil Gentili (@danogentili), JuanPotato, BigNerd95, TiagoDanin, and iicc1.

Released to the public domain wherever applicable. Elsewhere, consider it released under the WTFPLv2.

+

Linted by #ShellCheck

Prerequisites

Uses JSON.sh and the magic of sed.

Even bashbot is written in bash, it depends on commands typically available in a Unix/Linux Environment. More concret on the common commands provided by recent versions of coreutils, busybox or toybox, see Developer Notes

@@ -153,11 +154,11 @@ Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M (@gnadel
  • Examples Dir
  • Your really first bashbot in a nutshell

    -

    To install and run bashbot you need access to a linux/unix command line. If you don't know how to get access to a linux/unix/bsd like command line you should stop reading here :-(

    +

    To install and run bashbot you need access to a linux/unix command line. If you don't know how to get access to a linux/unix command line you should stop reading here :-(

    In addition you need a Telegram client and a mobile phone to register an account. If you don't want to register for Telegram you should stop reading here ;-)

    After you're registered to Telegram send a message to @botfather, create a new Telegram Bot token and write it down. You need the token to install the bot.

    -

    Now open a linux/unix/bsd terminal and check if bash is installed: which bash && echo "bash installed!". If you get an error message bash is not installed.

    -

    Create a new directory and change to it: mkdir tbb; cd tbb and download the latest '*.tar.gz' file from https://github.com/topkecleon/telegram-bot-bash/releases. This can be done with the commands:

    +

    Now open a terminal and check if bash is installed: which bash && echo "bash installed!". If you get an error message bash is not installed.

    +

    Create a new directory, change to it: mkdir tbb; cd tbb and download the latest '*.tar.gz' file from https://github.com/topkecleon/telegram-bot-bash/releases. This can be done with the commands:

    wget -q https://github.com/$(wget -q https://github.com/topkecleon/telegram-bot-bash/releases/latest -O - | egrep '/.*/.*/.*tar.gz' -o)

    Extract the '*.tar.gz' file and change to bashbot directory: tar -xzf *.tar.gz; cd telegram-bot-bash, install bashbot: ./bashbot.sh init and enter your bot token when asked. All other questions can be answered by hitting the <Return> key.

    That's all, now you can start your bot with ./bashbot.sh start and send him messages:

    @@ -189,12 +190,12 @@ It features background tasks and interactive chats, and can serve as an interfac

    Security Considerations

    Running a Telegram Bot means it is connected to the public and you never know what's send to your Bot.

    Bash scripts in general are not designed to be bullet proof, so consider this Bot as a proof of concept. Bash programmers often struggle with 'quoting hell' and globbing, see Implications of wrong quoting

    -

    Whenever you are processing input from from untrusted sources (messages, files, network) you must be as careful as possible, e.g. set IFS appropriate, disable globbing (set -f) and quote everything. In addition delete unused scripts and examples from your Bot, e.g. scripts 'notify', 'calc', 'question', and disable all not used commands.

    -

    Note: Until v0.941 (mai/22/2020) telegram-bot-bash had a remote code execution (RCE) bug, pls update if you use an older version! see Issue #125

    -

    One of the most powerful features of unix shells like bash is variable and command substitution using ${} and $(), but as they are expanded in double quotes, this can lead to RCE and information disclosing bugs in complex scripts like bashbot even bash does much to avoid this. So it's more secure to escape or remove '$' in input from user, files or network.

    -

    A powerful tool to improve your scripts is shellcheck. You can use it online or install shellcheck locally. Shellcheck is used extensive in bashbot development to enshure a high code quality, e.g. it's not allowed to push changes without passing all shellcheck tests. In addition bashbot has a test suite to check if important functionality is working as expected.

    -

    use printf whenever possible

    -

    If you're writing a script and it is taking external input (from the user as arguments, or file names from the file system...), you shouldn't use echo to display it. Use printf whenever possible

    +

    Whenever you are processing input from untrusted sources (messages, files, network) you must be as careful as possible, e.g. set IFS appropriate, disable globbing (set -f) and quote everything. In addition delete unused scripts and examples from your Bot, e.g. scripts 'notify', 'calc', 'question', and disable all not used commands.

    +

    Note: Until v0.941 (mai/22/2020) telegram-bot-bash had a remote code execution (RCE) bug, please update if you use an older version! see Issue #125

    +

    One of the most powerful features of unix shells is variable and command substitution using ${} and $(), but as they are expanded in double quotes, this can lead to RCE and information disclosing bugs in complex scripts like bashbot. So it's more secure to escape or remove '$' in input from user, files or network.

    +

    A powerful tool to improve your scripts is shellcheck. You can use it online or install shellcheck locally. Shellcheck is used extensive in bashbot development to ensure a high code quality, e.g. it's not allowed to push changes without passing all shellcheck tests. In addition bashbot has a test suite to check if important functionality is working as expected.

    +

    Use printf whenever possible

    +

    If you're writing a script and it is taking external input (from the user as arguments or file system...), you shouldn't use echo to display it. Use printf whenever possible

      # very simple
       echo "text with variables. PWD=$PWD"
       printf '%s\n' "text with variables. PWD=$PWD"
    @@ -209,26 +210,26 @@ It features background tasks and interactive chats, and can serve as an interfac
       ->text with variables. float=1.23, integer=12345, PWD=/home/xxx

    Do not use #!/usr/bin/env bash

    We stay with /bin/bash shebang, because it's more save from security perspective.

    -

    Using a fixed path to the system provided bash makes it harder for attackers or users to place alternative versions of bash and avoids using a possibly broken, mangled or compromised bash executable.

    +

    Use of a fixed path to the system provided bash makes it harder for attackers or users to place alternative versions of bash and avoids using a possibly broken, mangled or compromised bash executable.

    If you are a BSD / MacOS user or must to use an other bash location, see Install Bashbot

    Run your Bot as a restricted user

    -

    I recommend to run your bot as a user, with almost no access rights. All files your Bot have write access to are in danger to be overwritten/deleted if your bot is hacked. For the same reason every file your Bot can read is in danger to be disclosed. Restict your Bots access rights to the absolute minimum.

    -

    Never run your Bot as root, this is the most dangerous you can do! Usually the user 'nobody' has almost no rights on Unix/Linux systems. See Expert use on how to run your Bot as an other user.

    +

    I recommend to run your bot as a user, with almost no access rights. All files your Bot have write access to are in danger to be overwritten/deleted if your bot is hacked. For the same reason every file your Bot can read is in danger to be disclosed. Restrict your Bots access rights to the absolute minimum.

    +

    Never run your Bot as root, this is the most dangerous you can do! Usually the user 'nobody' has almost no rights on unix/linux systems. See Expert use on how to run your Bot as an other user.

    Secure your Bot installation

    -

    Your Bot configuration must no be readable from other users. Everyone who can read your Bots token can act as your Bot and has access to all chats your Bot is in!

    -

    Everyone with read access to your Bot files can extract your Bots data. Especially your Bot Token in token must be protected against other users. No one except you must have write access to the Bot files. The Bot must be restricted to have write access to count and tmp-bot-bash only, all other files must be write protected.

    +

    Your Bot configuration must no be readable from other users. Everyone who can read your Bots token is able to act as your Bot and has access to all chats the Bot is in!

    +

    Everyone with read access to your Bot files can extract your Bots data. Especially your Bot Token in token must be protected against other users. No one except you should have write access to the Bot files. The Bot should be restricted to have write access to count and tmp-bot-bash only, all other files must be write protected.

    To set access rights for your bashbot installation to a reasonable default run sudo ./bashbot.sh init after every update or change to your installation directory.

    FAQ

    Is this Bot insecure?

    -

    Bashbot is not more (in)secure as any other Bot written in any other language, we have done our best to make it as secure as possible. But YOU are responsible for the bot commands you wrote and you should know about the risks ...

    -

    Note: Until v0.941 (mai/22/2020) telegram-bot-bash has a remote code execution bug, pls update if you use an older version!

    +

    Bashbot is not more (in)secure as any Bot written in an other language, we have done our best to make it as secure as possible. But YOU are responsible for the bot commands you wrote and you should know about the risks ...

    +

    Note: Until v0.941 (mai/22/2020) telegram-bot-bash has a remote code execution bug, please update if you use an older version!

    Why Bash and not the much better xyz?

    -

    Well, that's a damn good question ... may be because I'm an Unix/Linux admin from stone age. Nevertheless there are more reasons from my side:

    +

    Well, that's a damn good question ... may be because I'm an unix admin from stone age. Nevertheless there are more reasons from my side:

    Can I have the single bashbot.sh file back?

    At the beginning bashbot was simply the file bashbot.sh you can copy everywhere and run the bot. Now we have 'commands.sh', 'mycommands.sh', 'modules/*.sh' and much more.

    @@ -241,22 +242,33 @@ It features background tasks and interactive chats, and can serve as an interfac source ./bashbot.sh source # send me a test message -send_message "$(cat "$BOTADMIN")" "test" +send_message "$(getConfigKey "botadmin")" "test" # send me output of a system command -send_message "$(<"$BOTADMIN")" "$(df -h)" +send_message "$(getConfigKey "botadmin")" "$(df -h)"

    For more information see Expert Use

    Blocked by telegram?

    -

    This may happen if to many wrong requests are sent to api.telegram.org, e.g. using a wrong token or not existing API calls. If you have a fixed IP you can ask telegram service to unblock your ip or change your IP. If you are running a tor proxy on your server you may uncomment the BASHBOT_CURL_ARGS line in 'mycommands.sh'

    -

    You can test if younare blockeds by running curl or wget manually:

    +

    This may happen if to many or wrong requests are sent to api.telegram.org, e.g. using a invalid token or not existing API calls. If the block stay for longer time you can ask telegram service to unblock your IP-Adress.

    +

    You can check with curl or wget if you are blocked by Telegram:

    curl -m 10  https://api.telegram.org/bot
     #curl: (28) Connection timed out after 10001 milliseconds
     
     wget -t 1 -T 10 https://api.telegram.org/bot
     #Connecting to api.telegram.org (api.telegram.org)|46.38.243.234|:443... failed: Connection timed out.
    +

    Since Version 0.96 bashbot offers the option to recover from broken connections (aka blocked). Therefore you can provide a function named bashbotBlockRecover() in mycommands.sh. If the function exists it is called every time when a broken connection is detected.

    +

    Possible actions are: Check if network is working, change IP-Adress or simply wait some time.

    +

    If everything seems OK return 0 for retry or any non 0 value to give up.

    +
    # called when bashbot sedn command failed because we can not connect to telegram
    +# return 0 to retry, return non 0 to give up
    +bashbotBlockRecover() {
    +    # place your commands to unblock here, e.g. change IP-Adess or simply wait
    +    sleep 60 && return 0 # may be temporary
    +    return 1 
    +    }
    +

    @Gnadelwartz

    That's it!

    If you feel that there's something missing or if you found a bug, feel free to submit a pull request!

    -

    $$VERSION$$ v0.98-0-g5b5447e

    +

    $$VERSION$$ 0.99-0-g2775000

    diff --git a/README.md b/README.md index 5a0cd3b..1f69e2d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@

    Bashbot - A Telegram bot written in bash.

    -Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M (@gnadelwartz). +Written by Drew (@topkecleon) and Kay M (@gnadelwartz). -Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1. +Contributions by Daniil Gentili (@danogentili), JuanPotato, BigNerd95, TiagoDanin, and iicc1. Released to the public domain wherever applicable. Elsewhere, consider it released under the [WTFPLv2](http://www.wtfpl.net/txt/copying/). +Linted by [#ShellCheck](https://github.com/koalaman/shellcheck) + ## Prerequisites Uses [JSON.sh](http://github.com/dominictarr/JSON.sh) and the magic of sed. @@ -64,7 +66,7 @@ Bashbot [Documentation](https://github.com/topkecleon/telegram-bot-bash) and [Do ### Your really first bashbot in a nutshell -To install and run bashbot you need access to a linux/unix command line. If you don't know how to get access to a linux/unix/bsd like command line you should stop reading here :-( +To install and run bashbot you need access to a linux/unix command line. If you don't know how to get access to a linux/unix command line you should stop reading here :-( In addition you need a [Telegram client](https://telegram.org) and a mobile phone to [register an account](https://telegramguide.com/create-a-telegram-account/). If you don't want to register for Telegram you should stop reading here ;-) @@ -72,10 +74,10 @@ If you don't want to register for Telegram you should stop reading here ;-) After you're registered to Telegram send a message to [@botfather](https://telegram.me/botfather), [create a new Telegram Bot token](doc/1_firstbot.md) and write it down. You need the token to install the bot. -Now open a linux/unix/bsd terminal and check if bash is installed: ```which bash && echo "bash installed!"```. +Now open a terminal and check if bash is installed: ```which bash && echo "bash installed!"```. If you get an error message bash is not installed. -Create a new directory and change to it: ```mkdir tbb; cd tbb``` and download the latest '*.tar.gz' file from +Create a new directory, change to it: ```mkdir tbb; cd tbb``` and download the latest '*.tar.gz' file from [https://github.com/topkecleon/telegram-bot-bash/releases](https://github.com/topkecleon/telegram-bot-bash/releases). This can be done with the commands: ```bash wget -q https://github.com/$(wget -q https://github.com/topkecleon/telegram-bot-bash/releases/latest -O - | egrep '/.*/.*/.*tar.gz' -o) @@ -125,21 +127,21 @@ Running a Telegram Bot means it is connected to the public and you never know wh Bash scripts in general are not designed to be bullet proof, so consider this Bot as a proof of concept. Bash programmers often struggle with 'quoting hell' and globbing, see [Implications of wrong quoting](https://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells) -Whenever you are processing input from from untrusted sources (messages, files, network) you must be as careful as possible, e.g. set IFS appropriate, disable globbing (set -f) and quote everything. In addition delete unused scripts and examples from your Bot, e.g. scripts 'notify', 'calc', 'question', and disable all not used commands. +Whenever you are processing input from untrusted sources (messages, files, network) you must be as careful as possible, e.g. set IFS appropriate, disable globbing (set -f) and quote everything. In addition delete unused scripts and examples from your Bot, e.g. scripts 'notify', 'calc', 'question', and disable all not used commands. -**Note:** Until v0.941 (mai/22/2020) telegram-bot-bash had a remote code execution (RCE) bug, pls update if you use an older version! +**Note:** Until v0.941 (mai/22/2020) telegram-bot-bash had a remote code execution (RCE) bug, please update if you use an older version! see [Issue #125](https://github.com/topkecleon/telegram-bot-bash/issues/125) -One of the most powerful features of unix shells like bash is variable and command substitution using ```${}``` and ```$()```, -but as they are expanded in double quotes, this can lead to RCE and information disclosing bugs in complex scripts like bashbot -even bash does much to avoid this. So it's more secure to escape or remove '$' in input from user, files or network. +One of the most powerful features of unix shells is variable and command substitution using ```${}``` and ```$()```, +but as they are expanded in double quotes, this can lead to RCE and information disclosing bugs in complex scripts like bashbot. +So it's more secure to escape or remove '$' in input from user, files or network. -A powerful tool to improve your scripts is ```shellcheck```. You can [use it online](https://www.shellcheck.net/) or [install shellcheck locally](https://github.com/koalaman/shellcheck#installing). Shellcheck is used extensive in bashbot development to enshure a high code quality, e.g. it's not allowed to push changes without passing all shellcheck tests. +A powerful tool to improve your scripts is ```shellcheck```. You can [use it online](https://www.shellcheck.net/) or [install shellcheck locally](https://github.com/koalaman/shellcheck#installing). Shellcheck is used extensive in bashbot development to ensure a high code quality, e.g. it's not allowed to push changes without passing all shellcheck tests. In addition bashbot has a [test suite](doc/7_develop.md) to check if important functionality is working as expected. -### use printf whenever possible +### Use printf whenever possible -If you're writing a script and it is taking external input (from the user as arguments, or file names from the file system...), +If you're writing a script and it is taking external input (from the user as arguments or file system...), you shouldn't use echo to display it. [Use printf whenever possible](https://unix.stackexchange.com/a/6581) ```bash @@ -161,7 +163,7 @@ you shouldn't use echo to display it. [Use printf whenever possible](https://uni **We stay with /bin/bash shebang, because it's more save from security perspective.** -Using a fixed path to the system provided bash makes it harder for attackers or users to place alternative versions of bash +Use of a fixed path to the system provided bash makes it harder for attackers or users to place alternative versions of bash and avoids using a possibly broken, mangled or compromised bash executable. If you are a BSD / MacOS user or must to use an other bash location, see [Install Bashbot](doc/0_install.md) @@ -169,31 +171,31 @@ If you are a BSD / MacOS user or must to use an other bash location, see [Insta ### Run your Bot as a restricted user **I recommend to run your bot as a user, with almost no access rights.** All files your Bot have write access to are in danger to be overwritten/deleted if your bot is hacked. -For the same reason every file your Bot can read is in danger to be disclosed. Restict your Bots access rights to the absolute minimum. +For the same reason every file your Bot can read is in danger to be disclosed. Restrict your Bots access rights to the absolute minimum. -**Never run your Bot as root, this is the most dangerous you can do!** Usually the user 'nobody' has almost no rights on Unix/Linux systems. See [Expert use](doc/4_expert.md) on how to run your Bot as an other user. +**Never run your Bot as root, this is the most dangerous you can do!** Usually the user 'nobody' has almost no rights on unix/linux systems. See [Expert use](doc/4_expert.md) on how to run your Bot as an other user. ### Secure your Bot installation -**Your Bot configuration must no be readable from other users.** Everyone who can read your Bots token can act as your Bot and has access to all chats your Bot is in! +**Your Bot configuration must no be readable from other users.** Everyone who can read your Bots token is able to act as your Bot and has access to all chats the Bot is in! -Everyone with read access to your Bot files can extract your Bots data. Especially your Bot Token in ```token``` must be protected against other users. No one except you must have write access to the Bot files. The Bot must be restricted to have write access to ```count``` and ```tmp-bot-bash``` only, all other files must be write protected. +Everyone with read access to your Bot files can extract your Bots data. Especially your Bot Token in ```token``` must be protected against other users. No one except you should have write access to the Bot files. The Bot should be restricted to have write access to ```count``` and ```tmp-bot-bash``` only, all other files must be write protected. To set access rights for your bashbot installation to a reasonable default run ```sudo ./bashbot.sh init``` after every update or change to your installation directory. ## FAQ ### Is this Bot insecure? -Bashbot is not more (in)secure as any other Bot written in any other language, we have done our best to make it as secure as possible. But YOU are responsible for the bot commands you wrote and you should know about the risks ... +Bashbot is not more (in)secure as any Bot written in an other language, we have done our best to make it as secure as possible. But YOU are responsible for the bot commands you wrote and you should know about the risks ... -**Note:** Until v0.941 (mai/22/2020) telegram-bot-bash has a remote code execution bug, pls update if you use an older version! +**Note:** Until v0.941 (mai/22/2020) telegram-bot-bash has a remote code execution bug, please update if you use an older version! ### Why Bash and not the much better xyz? -Well, that's a damn good question ... may be because I'm an Unix/Linux admin from stone age. Nevertheless there are more reasons from my side: +Well, that's a damn good question ... may be because I'm an unix admin from stone age. Nevertheless there are more reasons from my side: - bashbot will run everywhere where bash and (gnu) sed is available, from embedded linux to mainframe - easy to integrate with other shell script, e.g. for sending system message / health status - no need to install or learn a new programming language, library or framework -- no database, not event driven, not OO ... +- no database, not event driven, not object oriented ... ### Can I have the single bashbot.sh file back? At the beginning bashbot was simply the file ```bashbot.sh``` you can copy everywhere and run the bot. Now we have 'commands.sh', 'mycommands.sh', 'modules/*.sh' and much more. @@ -213,18 +215,19 @@ export BASHBOT_HOME="$(pwd)" source ./bashbot.sh source # send me a test message -send_message "$(cat "$BOTADMIN")" "test" +send_message "$(getConfigKey "botadmin")" "test" # send me output of a system command -send_message "$(<"$BOTADMIN")" "$(df -h)" +send_message "$(getConfigKey "botadmin")" "$(df -h)" ``` For more information see [Expert Use](doc/8_custom.md) ### Blocked by telegram? -This may happen if to many wrong requests are sent to api.telegram.org, e.g. using a wrong token or not existing API calls. If you have a fixed IP you can ask telegram service to unblock your ip or change your IP. If you are running a tor proxy on your server you may uncomment the ```BASHBOT_CURL_ARGS``` line in 'mycommands.sh' +This may happen if to many or wrong requests are sent to api.telegram.org, e.g. using a invalid token or not existing API calls. +If the block stay for longer time you can ask telegram service to unblock your IP-Adress. -You can test if younare blockeds by running curl or wget manually: +You can check with curl or wget if you are blocked by Telegram: ```bash curl -m 10 https://api.telegram.org/bot #curl: (28) Connection timed out after 10001 milliseconds @@ -233,10 +236,29 @@ wget -t 1 -T 10 https://api.telegram.org/bot #Connecting to api.telegram.org (api.telegram.org)|46.38.243.234|:443... failed: Connection timed out. ``` +Since Version 0.96 bashbot offers the option to recover from broken connections (aka blocked). Therefore you can provide a function +named `bashbotBlockRecover()` in `mycommands.sh`. If the function exists it is called every time when a broken connection is detected. + +Possible actions are: Check if network is working, change IP-Adress or simply wait some time. + +If everything seems OK return 0 for retry or any non 0 value to give up. + +```bash +# called when bashbot sedn command failed because we can not connect to telegram +# return 0 to retry, return non 0 to give up +bashbotBlockRecover() { + # place your commands to unblock here, e.g. change IP-Adess or simply wait + sleep 60 && return 0 # may be temporary + return 1 + } + +``` + + @Gnadelwartz ## That's it! If you feel that there's something missing or if you found a bug, feel free to submit a pull request! -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/README.txt b/README.txt index d80c3da..fc73186 100644 --- a/README.txt +++ b/README.txt @@ -3,15 +3,17 @@ src="https://raw.githubusercontent.com/odb/official-bash-logo/master/assets/Logo s/Icons/PNG/64x64.png" > Bashbot - A Telegram bot written in bash. -Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M -(@gnadelwartz). +Written by Drew (@topkecleon) and Kay M (@gnadelwartz). -Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1. +Contributions by Daniil Gentili (@danogentili), JuanPotato, BigNerd95, +TiagoDanin, and iicc1. Released to the public domain wherever applicable. Elsewhere, consider it released under the [WTFPLv2](http://www.wtfpl.net/txt/copying/). +Linted by [#ShellCheck](https://github.com/koalaman/shellcheck) + ## Prerequisites Uses [JSON.sh](http://github.com/dominictarr/JSON.sh) and the magic of sed. @@ -78,8 +80,8 @@ available on www.github.com ### Your really first bashbot in a nutshell To install and run bashbot you need access to a linux/unix command line. If you -don't know how to get access to a linux/unix/bsd like command line you should -stop reading here :-( +don't know how to get access to a linux/unix command line you should stop +reading here :-( In addition you need a [Telegram client](https://telegram.org) and a mobile phone to [register an @@ -91,12 +93,12 @@ After you're registered to Telegram send a message to [create a new Telegram Bot token](doc/1_firstbot.md) and write it down. You need the token to install the bot. -Now open a linux/unix/bsd terminal and check if bash is installed: ```which -bash && echo "bash installed!"```. +Now open a terminal and check if bash is installed: ```which bash && echo "bash +installed!"```. If you get an error message bash is not installed. -Create a new directory and change to it: ```mkdir tbb; cd tbb``` and download -the latest '*.tar.gz' file from +Create a new directory, change to it: ```mkdir tbb; cd tbb``` and download the +latest '*.tar.gz' file from [https://github.com/topkecleon/telegram-bot-bash/releases](https://github.com/to pkecleon/telegram-bot-bash/releases). This can be done with the commands: ```bash @@ -162,35 +164,35 @@ and globbing, see [Implications of wrong quoting](https://unix.stackexchange.com/questions/171346/security-implications-o f-forgetting-to-quote-a-variable-in-bash-posix-shells) -Whenever you are processing input from from untrusted sources (messages, files, +Whenever you are processing input from untrusted sources (messages, files, network) you must be as careful as possible, e.g. set IFS appropriate, disable globbing (set -f) and quote everything. In addition delete unused scripts and examples from your Bot, e.g. scripts 'notify', 'calc', 'question', and disable all not used commands. **Note:** Until v0.941 (mai/22/2020) telegram-bot-bash had a remote code -execution (RCE) bug, pls update if you use an older version! +execution (RCE) bug, please update if you use an older version! see [Issue #125](https://github.com/topkecleon/telegram-bot-bash/issues/125) -One of the most powerful features of unix shells like bash is variable and -command substitution using ```${}``` and ```$()```, +One of the most powerful features of unix shells is variable and command +substitution using ```${}``` and ```$()```, but as they are expanded in double quotes, this can lead to RCE and information -disclosing bugs in complex scripts like bashbot -even bash does much to avoid this. So it's more secure to escape or remove '$' -in input from user, files or network. +disclosing bugs in complex scripts like bashbot. +So it's more secure to escape or remove '$' in input from user, files or +network. A powerful tool to improve your scripts is ```shellcheck```. You can [use it online](https://www.shellcheck.net/) or [install shellcheck locally](https://github.com/koalaman/shellcheck#installing). Shellcheck is used -extensive in bashbot development to enshure a high code quality, e.g. it's not +extensive in bashbot development to ensure a high code quality, e.g. it's not allowed to push changes without passing all shellcheck tests. In addition bashbot has a [test suite](doc/7_develop.md) to check if important functionality is working as expected. -### use printf whenever possible +### Use printf whenever possible If you're writing a script and it is taking external input (from the user as -arguments, or file names from the file system...), +arguments or file system...), you shouldn't use echo to display it. [Use printf whenever possible](https://unix.stackexchange.com/a/6581) @@ -215,8 +217,8 @@ possible](https://unix.stackexchange.com/a/6581) **We stay with /bin/bash shebang, because it's more save from security perspective.** -Using a fixed path to the system provided bash makes it harder for attackers or -users to place alternative versions of bash +Use of a fixed path to the system provided bash makes it harder for attackers +or users to place alternative versions of bash and avoids using a possibly broken, mangled or compromised bash executable. If you are a BSD / MacOS user or must to use an other bash location, see @@ -227,20 +229,20 @@ If you are a BSD / MacOS user or must to use an other bash location, see All files your Bot have write access to are in danger to be overwritten/deleted if your bot is hacked. For the same reason every file your Bot can read is in danger to be disclosed. -Restict your Bots access rights to the absolute minimum. +Restrict your Bots access rights to the absolute minimum. **Never run your Bot as root, this is the most dangerous you can do!** Usually -the user 'nobody' has almost no rights on Unix/Linux systems. See [Expert +the user 'nobody' has almost no rights on unix/linux systems. See [Expert use](doc/4_expert.md) on how to run your Bot as an other user. ### Secure your Bot installation **Your Bot configuration must no be readable from other users.** Everyone who -can read your Bots token can act as your Bot and has access to all chats your -Bot is in! +can read your Bots token is able to act as your Bot and has access to all chats +the Bot is in! Everyone with read access to your Bot files can extract your Bots data. Especially your Bot Token in ```token``` must be protected against other users. -No one except you must have write access to the Bot files. The Bot must be +No one except you should have write access to the Bot files. The Bot should be restricted to have write access to ```count``` and ```tmp-bot-bash``` only, all other files must be write protected. @@ -251,23 +253,23 @@ directory. ## FAQ ### Is this Bot insecure? -Bashbot is not more (in)secure as any other Bot written in any other language, -we have done our best to make it as secure as possible. But YOU are responsible -for the bot commands you wrote and you should know about the risks ... +Bashbot is not more (in)secure as any Bot written in an other language, we have +done our best to make it as secure as possible. But YOU are responsible for the +bot commands you wrote and you should know about the risks ... **Note:** Until v0.941 (mai/22/2020) telegram-bot-bash has a remote code -execution bug, pls update if you use an older version! +execution bug, please update if you use an older version! ### Why Bash and not the much better xyz? -Well, that's a damn good question ... may be because I'm an Unix/Linux admin -from stone age. Nevertheless there are more reasons from my side: +Well, that's a damn good question ... may be because I'm an unix admin from +stone age. Nevertheless there are more reasons from my side: - bashbot will run everywhere where bash and (gnu) sed is available, from embedded linux to mainframe - easy to integrate with other shell script, e.g. for sending system message / health status - no need to install or learn a new programming language, library or framework -- no database, not event driven, not OO ... +- no database, not event driven, not object oriented ... ### Can I have the single bashbot.sh file back? At the beginning bashbot was simply the file ```bashbot.sh``` you can copy @@ -295,22 +297,21 @@ export BASHBOT_HOME="$(pwd)" source ./bashbot.sh source # send me a test message -send_message "$(cat "$BOTADMIN")" "test" +send_message "$(getConfigKey "botadmin")" "test" # send me output of a system command -send_message "$(<"$BOTADMIN")" "$(df -h)" +send_message "$(getConfigKey "botadmin")" "$(df -h)" ``` For more information see [Expert Use](doc/8_custom.md) ### Blocked by telegram? -This may happen if to many wrong requests are sent to api.telegram.org, e.g. -using a wrong token or not existing API calls. If you have a fixed IP you can -ask telegram service to unblock your ip or change your IP. If you are running a -tor proxy on your server you may uncomment the ```BASHBOT_CURL_ARGS``` line in -'mycommands.sh' +This may happen if to many or wrong requests are sent to api.telegram.org, e.g. +using a invalid token or not existing API calls. +If the block stay for longer time you can ask telegram service to unblock your +IP-Adress. -You can test if younare blockeds by running curl or wget manually: +You can check with curl or wget if you are blocked by Telegram: ```bash curl -m 10 https://api.telegram.org/bot #curl: (28) Connection timed out after 10001 milliseconds @@ -320,6 +321,29 @@ wget -t 1 -T 10 https://api.telegram.org/bot failed: Connection timed out. ``` +Since Version 0.96 bashbot offers the option to recover from broken connections +(aka blocked). Therefore you can provide a function +named `bashbotBlockRecover()` in `mycommands.sh`. If the function exists it is +called every time when a broken connection is detected. + +Possible actions are: Check if network is working, change IP-Adress or simply +wait some time. + +If everything seems OK return 0 for retry or any non 0 value to give up. + +```bash +# called when bashbot sedn command failed because we can not connect to telegram +# return 0 to retry, return non 0 to give up +bashbotBlockRecover() { + # place your commands to unblock here, e.g. change IP-Adess or simply +wait + sleep 60 && return 0 # may be temporary + return 1 + } + +``` + + @Gnadelwartz ## That's it! @@ -327,4 +351,4 @@ failed: Connection timed out. If you feel that there's something missing or if you found a bug, feel free to submit a pull request! -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/addons/antiFlood.sh b/addons/antiFlood.sh index 9b3ad76..ea85748 100644 --- a/addons/antiFlood.sh +++ b/addons/antiFlood.sh @@ -4,7 +4,7 @@ # this addon counts how many files, e.g. stickers, are sent to # a chat and takes actions if threshold is reached # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # used events: # diff --git a/addons/example.sh b/addons/example.sh index bfd3fa2..b28fb83 100644 --- a/addons/example.sh +++ b/addons/example.sh @@ -4,7 +4,7 @@ # Addons can register to bashbot events at startup # by providing their name and a callback per event # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # # If an event occurs each registered event function is called. # diff --git a/bashbot.rc b/bashbot.rc index c92d0f3..0bfb8dc 100755 --- a/bashbot.rc +++ b/bashbot.rc @@ -1,7 +1,7 @@ #!/bin/sh # description: Start or stop telegram-bash-bot # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # shellcheck disable=SC2009 # shellcheck disable=SC2181 diff --git a/bashbot.sh b/bashbot.sh index 6ffb7e5..c5986d7 100755 --- a/bashbot.sh +++ b/bashbot.sh @@ -11,7 +11,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.981-0-g3552876 +#### $$VERSION$$ 0.99-0-g2775000 # # Exit Codes: # - 0 success (hopefully) @@ -381,7 +381,7 @@ if [ -z "${BASHBOT_WGET}" ] && _exists curl ; then [ -z "${BASHBOT_CURL}" ] && BASHBOT_CURL="curl" # simple curl or wget call, output to stdout getJson(){ - [[ -n "${BASHBOTDEBUG}" && -n "${3}" ]] && printf "%s: getJson (curl) URL=%s\n" "$(date)" "${1##*/}" 1>&2 + [[ -n "${BASHBOTDEBUG}" && -n "${3}" ]] && printf "%s: getJson (curl) URL=%s\n" "$(date)" "${1##*/}" >>"${DEBUGLOG}" # shellcheck disable=SC2086 "${BASHBOT_CURL}" -sL -k ${BASHBOT_CURL_ARGS} -m "${TIMEOUT}" "$1" } @@ -389,7 +389,8 @@ if [ -z "${BASHBOT_WGET}" ] && _exists curl ; then sendJson(){ local chat=""; [ -n "${1}" ] && chat='"chat_id":'"${1}"',' - [ -n "${BASHBOTDEBUG}" ] && printf "%s: sendJson (curl) CHAT=%s JSON=%s URL=%s\n" "$(date)" "${1}" "${2:0:100}" "${3##*/}" 1>&2 + [ -n "${BASHBOTDEBUG}" ] &&\ + printf "%s: sendJson (curl) CHAT=%s JSON=%s URL=%s\n" "$(date)" "${1}" "${2:0:100}" "${3##*/}" >>"${DEBUGLOG}" # shellcheck disable=SC2086 res="$("${BASHBOT_CURL}" -s -k ${BASHBOT_CURL_ARGS} -m "${TIMEOUT}"\ -d '{'"${chat} $(iconv -f utf-8 -t utf-8 -c <<<$2)"'}' -X POST "${3}" \ @@ -401,7 +402,8 @@ if [ -z "${BASHBOT_WGET}" ] && _exists curl ; then sendUpload() { [ "$#" -lt 4 ] && return if [ -n "$5" ]; then - [ -n "${BASHBOTDEBUG}" ] && printf "%s: sendUpload CHAT=%s WHAT=%s FILE=%s CAPT=%s\n" "$(date)" "${1}" "${2}" "${3}" "${4}" 1>&2 + [ -n "${BASHBOTDEBUG}" ] &&\ + printf "%s: sendUpload CHAT=%s WHAT=%s FILE=%s CAPT=%s\n" "$(date)" "${1}" "${2}" "${3}" "${4}" >>"${DEBUGLOG}" # shellcheck disable=SC2086 res="$("${BASHBOT_CURL}" -s -k ${BASHBOT_CURL_ARGS} "$4" -F "chat_id=$1"\ -F "$2=@$3;${3##*/}" -F "caption=$5" | "${JSONSHFILE}" -s -b -n 2>/dev/null )" @@ -416,7 +418,7 @@ if [ -z "${BASHBOT_WGET}" ] && _exists curl ; then else # simple curl or wget call outputs result to stdout getJson(){ - [[ -n "${BASHBOTDEBUG}" && -z "${3}" ]] && printf "%s: getJson (wget) URL=%s\n" "$(date)" "${1##*/}" 1>&2 + [[ -n "${BASHBOTDEBUG}" && -z "${3}" ]] && printf "%s: getJson (wget) URL=%s\n" "$(date)" "${1##*/}" >>"${DEBUGLOG}" # shellcheck disable=SC2086 wget --no-check-certificate -t 2 -T "${TIMEOUT}" ${BASHBOT_WGET_ARGS} -qO - "$1" } @@ -424,7 +426,8 @@ else sendJson(){ local chat=""; [ -n "${1}" ] && chat='"chat_id":'"${1}"',' - [ -n "${BASHBOTDEBUG}" ] && printf "%s: sendJson (wget) CHAT=%s JSON=%s URL=%s\n" "$(date)" "${1}" "${2:0:100}" "${3##*/}" 1>&2 + [ -n "${BASHBOTDEBUG}" ] &&\ + printf "%s: sendJson (wget) CHAT=%s JSON=%s URL=%s\n" "$(date)" "${1}" "${2:0:100}" "${3##*/}" >>"${DEBUGLOG}" # shellcheck disable=SC2086 res="$(wget --no-check-certificate -t 2 -T "${TIMEOUT}" ${BASHBOT_WGET_ARGS} -qO - --post-data='{'"${chat} $(iconv -f utf-8 -t utf-8 -c <<<$2)"'}' \ --header='Content-Type:application/json' "${3}" | "${JSONSHFILE}" -s -b -n 2>/dev/null )" @@ -496,7 +499,7 @@ sendJsonResult(){ # OK, we can retry sendJson, let's see what's failed # throttled, telegram say we send to much messages if [ -n "${BOTSENT[RETRY]}" ]; then - BASHBOT_RETRY="$(( BOTSENT[RETRY]++ ))" + BASHBOT_RETRY="$(( ++BOTSENT[RETRY] ))" printf "Retry %s in %s seconds ...\n" "${2}" "${BASHBOT_RETRY}" sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" unset BASHBOT_RETRY @@ -506,7 +509,7 @@ sendJsonResult(){ if [ "${BOTSENT[ERROR]}" == "999" ];then # check if default curl and args are OK if ! curl -sL -k -m 2 "${URL}" >/dev/null 2>&1 ; then - printf "%s: BASHBOT IP Address is blocked!\n" "$(date)" + printf "%s: BASHBOT IP Address seems blocked!\n" "$(date)" # user provided function to recover or notify block if _exec_if_function bashbotBlockRecover; then BASHBOT_RETRY="2" @@ -778,7 +781,7 @@ process_inline() { process_message() { local num="$1" # Message - MESSAGE[0]+="$(JsonDecode "${UPD["result",${num},"message","text"]}" | sed 's#\\/#/#g')" + MESSAGE[0]+="$(JsonDecode "${UPD["result",${num},"message","text"]}" | sed 's|\\/|/|g')" MESSAGE[ID]="${UPD["result",${num},"message","message_id"]}" # Chat ID is now parsed when update isreceived @@ -1125,7 +1128,22 @@ if [ -z "${SOURCE}" ]; then do (( MESSAGES+=MSG )) done - echo "A total of ${MESSAGES} messages from ${USERS} users are processed." + if [ "${USERS}" != "" ]; then + echo "A total of ${MESSAGES} messages from ${USERS} users are processed." + else + echo "No one used your bot so far ..." + fi + jssh_readDB_async "STATS" "${BLOCKEDFILE}" + for MSG in ${!STATS[*]} + do + [[ ! "${MSG}" =~ ^[0-9-]*$ ]] && continue + (( BLOCKS++ )) + done + if [ "${BLOCKS}" != "" ]; then + echo -e "Note: ${BLOCKS} users are blocked by your bot:${GREY}" + sort -r "${BLOCKEDFILE}.jssh" + echo -e "${NC}\c" + fi debug_checks "end $1" "$@" exit ;; diff --git a/commands.sh b/commands.sh index 6c5635d..1da6bdb 100644 --- a/commands.sh +++ b/commands.sh @@ -15,7 +15,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # # adjust your language setting here, e.g.when run from other user or cron. diff --git a/dev/all-tests.sh b/dev/all-tests.sh index dc2b65e..8dc104c 100755 --- a/dev/all-tests.sh +++ b/dev/all-tests.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # this has to run once atfer git clone # and every time we create new hooks -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # magic to ensure that we're always inside the root of our application, # no matter from which directory we'll run script diff --git a/dev/git-add.sh b/dev/git-add.sh index 8ef2220..319e5e9 100755 --- a/dev/git-add.sh +++ b/dev/git-add.sh @@ -3,7 +3,7 @@ # # works together with git pre-push.sh and ADD all changed files since last push -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # magic to ensure that we're always inside the root of our application, # no matter from which directory we'll run script diff --git a/dev/hooks/pre-commit.sh b/dev/hooks/pre-commit.sh index b3658c0..502ec31 100755 --- a/dev/hooks/pre-commit.sh +++ b/dev/hooks/pre-commit.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ############ # NOTE: you MUST run install-hooks.sh again when updating this file! @@ -22,9 +22,9 @@ unset IFS; set -f # check for shellcheck if command -v shellcheck >/dev/null 2>&1; then - echo " Test all scripts with shellcheck ..." + echo "Test all scripts with shellcheck" else - echo "Error: shellcheck is not installed. Install shellcheck or delete $0" + echo "Error: shellcheck is not installed. Please install shellcheck" exit 1 fi @@ -37,6 +37,7 @@ if [ "$FILES" != "" ]; then # shellcheck disable=SC2086 shellcheck -x ${FILES} || exit 1 echo " OK" + echo "............................" else # something went wrong exit 1 @@ -47,6 +48,7 @@ VERSION="$(git describe --tags | sed -e 's/-.*//' -e 's/v//' -e 's/,/./')" # LOCAL version must greater than latest REMOTE release version +echo "Update Version of modified files" if (( $(echo "${VERSION} >= ${REMOTEVER}" | bc -l) )); then # update version in bashbot files on push set +f @@ -56,9 +58,21 @@ if (( $(echo "${VERSION} >= ${REMOTEVER}" | bc -l) )); then # shellcheck disable=SC2086 dev/version.sh ${LASTFILES} 2>/dev/null || exit 1 echo " OK" + echo "............................" else - echo "Error: local version ${VERSION} must be greater or equal to release version ${REMOTEVER}." - echo "use \"git tag ...\" to create a new local version" + echo "Error: local version ${VERSION} must be equal to or greater then release version ${REMOTEVER}." + echo "use \"git tag vx.zz\" to create a new local version" exit 1 fi +if which codespell &>/dev/null; then + echo "Running codespell" + echo "............................" + codespell -B 1 --skip="*.log,*.html,*.txt,.git*" -L "ba" + echo "if there are (to many) typo's shown, consider running:" + echo "codespell -i 3 -w --skip=\"*.log,*.html,*.txt,.git*\" -L \"ba\"" +else + echo "consider installing codespell: pip install codespell" +fi +echo "............................" + diff --git a/dev/hooks/pre-push.sh b/dev/hooks/pre-push.sh index db53fb7..1ddddf1 100755 --- a/dev/hooks/pre-push.sh +++ b/dev/hooks/pre-push.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ############ # NOTE: you MUST run install-hooks.sh again when updating this file! @@ -20,15 +20,5 @@ echo "............................" unset IFS; set -f -if which codespell &>/dev/null; then - echo "Running codespell" - echo "............................" - codespell -B 1 --skip="*.log,*.html,*.txt,.git*" -L "ba" - echo "if there are (to many) typo's shown, consider running:" - echo "codespell -i 3 -w --skip=\"*.log,*.html,*.txt,.git*\" -L \"ba\"" -else - echo "consider installing codespell: pip install codespell" -fi -echo "............................" # note date of last push for version touch "${LASTPUSH}" diff --git a/dev/install-hooks.sh b/dev/install-hooks.sh index dd51d74..fb3e4d6 100755 --- a/dev/install-hooks.sh +++ b/dev/install-hooks.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # this has to run once atfer git clone # and every time we create new hooks -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # magic to ensure that we're always inside the root of our application, # no matter from which directory we'll run script diff --git a/dev/make-distribution.sh b/dev/make-distribution.sh index f1932e6..1ffd5bd 100755 --- a/dev/make-distribution.sh +++ b/dev/make-distribution.sh @@ -2,7 +2,7 @@ # file: make-distribution.sh # creates files and arcchives to dirtribute bashbot # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # magic to ensure that we're always inside the root of our application, # no matter from which directory we'll run script diff --git a/dev/make-standalone.sh b/dev/make-standalone.sh index a76bf76..5cc980d 100755 --- a/dev/make-standalone.sh +++ b/dev/make-standalone.sh @@ -5,7 +5,7 @@ # If you your bot is finished you can use make-standalone.sh to create the # the old all-in-one bashbot: bashbot.sh and commands.sh only! # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # magic to ensure that we're always inside the root of our application, # no matter from which directory we'll run script diff --git a/dev/shellcheck.files b/dev/shellcheck.files index 1bc1229..f5b76f5 100644 --- a/dev/shellcheck.files +++ b/dev/shellcheck.files @@ -1,4 +1,4 @@ # list of additional files to check from shellcheck -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 bashbot.rc mycommands.sh.clean diff --git a/dev/version.sh b/dev/version.sh index 9eb22d2..997178f 100755 --- a/dev/version.sh +++ b/dev/version.sh @@ -1,6 +1,6 @@ #!/bin/bash # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # shellcheck disable=SC2016 # # Easy Versioning in git: diff --git a/doc/0_install.md b/doc/0_install.md index 24bf8b6..794fc4b 100644 --- a/doc/0_install.md +++ b/doc/0_install.md @@ -15,7 +15,7 @@ Now your Bot is ready to start ... **If you are new to Bot development read [Bots: An introduction for developers](https://core.telegram.org/bots)** -### Install from Github +### Install from github As an alternative to download the zip files, you can clone the github repository to get the latest improvements/fixes. @@ -63,7 +63,7 @@ BSD/MacOS sed compatibility will result in a rewrite of all grep/sed commands wi see [BSD/MacOS vs. GNU sed](https://riptutorial.com/sed/topic/9436/bsd-macos-sed-vs--gnu-sed-vs--the-posix-sed-specification) to get an impression how different they are. -If you are a sed guru and can convert the following examples to work correct with gnu and BSD sed, contact me. +If you can convert the following examples to work correct with gnu and BSD sed, contact me. ```bash # easy start @@ -131,5 +131,5 @@ The old format is supported for backward compatibility, but may fail for corner #### [Next Create Bot](1_firstbot.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/1_firstbot.md b/doc/1_firstbot.md index 9fd6d76..d788a50 100644 --- a/doc/1_firstbot.md +++ b/doc/1_firstbot.md @@ -1,5 +1,5 @@ #### [Home](../README.md) -## Create a Telegram Bot with botfather +## Create a Telegram Bot with Botfather **[BotFather is the one bot to rule them all](https://core.telegram.org/bots#3-how-do-i-create-a-bot). It will help you create new bots and change settings for existing ones.** [Commands known by Botfather](https://core.telegram.org/bots#generating-an-authorization-token) ### Creating a new Bot @@ -9,7 +9,7 @@ text: `/newbot` If you don't know how to message by username, click the search field on your Telegram app and type `@botfather`, you should be able to initiate a conversation. Be careful not to send it to the wrong -contact, because some users has similar usernames to `botfather`. +contact, because there are users with a similar username. ![botfather initial conversation](http://i.imgur.com/aI26ixR.png) @@ -65,5 +65,5 @@ group. This step is up to you actually. #### [Prev Installation](0_install.md) #### [Next Getting started](2_usage.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/2_usage.md b/doc/2_usage.md index 8899062..554ca07 100644 --- a/doc/2_usage.md +++ b/doc/2_usage.md @@ -283,5 +283,5 @@ send_action "${CHAT[ID]}" "action" #### [Prev Create Bot](1_firstbot.md) #### [Next Advanced Usage](3_advanced.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/3_advanced.md b/doc/3_advanced.md index 3870d73..09fe4ac 100644 --- a/doc/3_advanced.md +++ b/doc/3_advanced.md @@ -6,7 +6,6 @@ Bashbot offers functions to check what Telegram capabilities like 'chat admin' o ```bash # return true if user is admin/owner of the bot -# -> botadmin is stored in file './botadmin' user_is_botadmin "user" # return true if user is creator or admin of a chat @@ -289,5 +288,5 @@ Note: If you disable automatic retry, se above, you disable also connection prob #### [Prev Getting started](2_usage.md) #### [Next Expert Use](4_expert.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/4_expert.md b/doc/4_expert.md index 993fbaa..b1159bc 100644 --- a/doc/4_expert.md +++ b/doc/4_expert.md @@ -381,5 +381,5 @@ for every poll until the maximum of BASHBOT_SLEEP ms. #### [Prev Advanced Use](3_advanced.md) #### [Next Best Practice](5_practice.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/5_practice.md b/doc/5_practice.md index e8dd4a8..30110f4 100644 --- a/doc/5_practice.md +++ b/doc/5_practice.md @@ -152,5 +152,5 @@ The second warning is about an unused variable, this is true because in our exam #### [Prev Best Practice](5_practice.md) #### [Next Functions Reference](6_reference.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/6_reference.md b/doc/6_reference.md index 61e9aee..0453ef8 100644 --- a/doc/6_reference.md +++ b/doc/6_reference.md @@ -1046,5 +1046,5 @@ The name of your bot is available as bash variable "$ME", there is no need to ca #### [Prev Best Practice](5_practice.md) #### [Next Notes for Developers](7_develop.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/doc/7_develop.md b/doc/7_develop.md index e5219e3..0c28296 100644 --- a/doc/7_develop.md +++ b/doc/7_develop.md @@ -347,5 +347,5 @@ fi #### [Prev Function Reference](6_reference.md) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/examples/README.md b/examples/README.md index 133a3d7..358dd2d 100644 --- a/examples/README.md +++ b/examples/README.md @@ -55,6 +55,6 @@ convert existing bots. **external-use** will contain some examples on how to send messages from external scripts to Telegram chats or users. -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 diff --git a/examples/background-scripts/run_diskusage.sh b/examples/background-scripts/run_diskusage.sh index 52ec373..77a8f6c 100755 --- a/examples/background-scripts/run_diskusage.sh +++ b/examples/background-scripts/run_diskusage.sh @@ -4,7 +4,7 @@ # # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/background-scripts/run_filecontent.sh b/examples/background-scripts/run_filecontent.sh index 5375cd6..a98b10a 100755 --- a/examples/background-scripts/run_filecontent.sh +++ b/examples/background-scripts/run_filecontent.sh @@ -2,7 +2,7 @@ # file: run_filename # background job to display content of all new files in WATCHDIR # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/background-scripts/run_filename.sh b/examples/background-scripts/run_filename.sh index faac4d9..2053dd7 100755 --- a/examples/background-scripts/run_filename.sh +++ b/examples/background-scripts/run_filename.sh @@ -2,7 +2,7 @@ # file: run_filename # background job to display all new files in WATCHDIR # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/background-scripts/run_notify.sh b/examples/background-scripts/run_notify.sh index 3f497c4..16788dd 100755 --- a/examples/background-scripts/run_notify.sh +++ b/examples/background-scripts/run_notify.sh @@ -4,7 +4,7 @@ # # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/bash2env.sh b/examples/bash2env.sh index 21345ce..3125262 100755 --- a/examples/bash2env.sh +++ b/examples/bash2env.sh @@ -6,7 +6,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # adjust your language setting here # https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment diff --git a/examples/bashbot-multi.sh b/examples/bashbot-multi.sh index 34f35f6..4ef8292 100755 --- a/examples/bashbot-multi.sh +++ b/examples/bashbot-multi.sh @@ -2,7 +2,7 @@ # file. multibot.sh # description: run multiple telegram bots from one installation # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 if [ "${2}" = "" ] || [ "${2}" = "-h" ]; then echo "Usage: $0 botname command" diff --git a/examples/bashbot.cron b/examples/bashbot.cron index 4487aaf..9c253a1 100644 --- a/examples/bashbot.cron +++ b/examples/bashbot.cron @@ -7,7 +7,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 SHELL=/bin/sh @@ -27,9 +27,9 @@ MAILTO=root # * * * * * USER command to execute # * * * * * root echo "run every minute!" -# run as www every day at 0:00 plus random sleep between 1-3h - 0 0 * * * nobody sleep "${RANDOM:0:4}s" ; /usr/local/telegram-bot-bash/bashbot.sh start # (re)start bot - 0 0 * * * nobody sleep "${RANDOM:0:4}s" ; /usr/local/telegram-bot-bash/bashbot.sh resumeback # (re)start background jobs +# run as www every day at 0:00 plus random sleep between 0-3h + 0 0 * * * nobody sleep "$((RANDOM \% 180 ))m" ; /usr/local/telegram-bot-bash/bashbot.sh start # (re)start bot + 0 0 * * * nobody sleep "$((RANDOM \% 180 ))m" ; /usr/local/telegram-bot-bash/bashbot.sh resumeback # (re)start background jobs # run as www on 24 of Dec, 12:00 0 12 24 12 * nobody /usr/local/telegram-bot-bash/bashbot.sh broadcast "X-Mas shopping is over!" # broadcast a message diff --git a/examples/calc.sh b/examples/calc.sh index ad6e59e..f9a9104 100755 --- a/examples/calc.sh +++ b/examples/calc.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/notify.sh b/examples/notify.sh index ca234fd..2d2c9c2 100755 --- a/examples/notify.sh +++ b/examples/notify.sh @@ -4,7 +4,7 @@ # # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/question.sh b/examples/question.sh index 8d340da..4f032b1 100755 --- a/examples/question.sh +++ b/examples/question.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/examples/send-system-status/botacl b/examples/send-system-status/botacl index 28738a5..a5cec5d 100644 --- a/examples/send-system-status/botacl +++ b/examples/send-system-status/botacl @@ -1,7 +1,7 @@ # file: botacl # a user not listed here, will return false from 'user_is_allowed' # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # Format: # user:resource:chat diff --git a/examples/send-system-status/mycommands.sh b/examples/send-system-status/mycommands.sh index 860ac71..e8f5712 100644 --- a/examples/send-system-status/mycommands.sh +++ b/examples/send-system-status/mycommands.sh @@ -5,7 +5,7 @@ # to show how you can customize bashbot by only editing mycommands.sh # NOTE: this is not tested, simply copied from original source and reworked! # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # # shellcheck disable=SC2154 # shellcheck disable=SC2034 diff --git a/modules/aliases.sh b/modules/aliases.sh index 514263d..3750e0b 100644 --- a/modules/aliases.sh +++ b/modules/aliases.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # # will be automatically sourced from bashbot diff --git a/modules/answerInline.sh b/modules/answerInline.sh index 978ee24..527eb67 100644 --- a/modules/answerInline.sh +++ b/modules/answerInline.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # will be automatically sourced from bashbot diff --git a/modules/background.sh b/modules/background.sh index c7a4d4d..2277f54 100644 --- a/modules/background.sh +++ b/modules/background.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # will be automatically sourced from bashbot diff --git a/modules/chatMember.sh b/modules/chatMember.sh index f36f5a2..f4dadc9 100644 --- a/modules/chatMember.sh +++ b/modules/chatMember.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # will be automatically sourced from bashbot diff --git a/modules/jsonDB.sh b/modules/jsonDB.sh index 7e87678..ccbd5cd 100644 --- a/modules/jsonDB.sh +++ b/modules/jsonDB.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # # source from commands.sh to use jsonDB functions # diff --git a/modules/sendMessage.sh b/modules/sendMessage.sh index e719e22..145bac2 100644 --- a/modules/sendMessage.sh +++ b/modules/sendMessage.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # will be automatically sourced from bashbot diff --git a/mycommands.sh b/mycommands.sh index f03b7d6..ad20f4b 100644 --- a/mycommands.sh +++ b/mycommands.sh @@ -8,7 +8,7 @@ # #### if you start to develop your own bot, use the clean version of this file: # #### mycommands.clean # -#### $$VERSION$$ v0.98-2-g2d48670 +#### $$VERSION$$ 0.99-0-g2775000 # # uncomment the following lines to overwrite info and help messages @@ -56,6 +56,10 @@ export SILENCER="no" # export WELCOME_NEWMEMBER="yes" WELCOME_MSG="Welcome" +# uncomment if you want to be informed about new/left chat members +# export REPORT_NEWMEMBER="yes" +# export REPORT_LEFTMEMBER="yes" + # messages for admin only commands NOTADMIN="Sorry, this command is allowed for admin or owner only" NOTBOTADMIN="Sorry, this command is allowed for bot owner only" @@ -107,6 +111,8 @@ else ;;& esac + # fix first letter upper case because of smartphone auto correction + [[ "${MESSAGE}" =~ ^/[[:upper:]] ]] && MESSAGE="${MESSAGE:0:1}$(tr '[:upper:]' '[:lower:]' <<<"${MESSAGE:1:1}")${MESSAGE:2}" # pre-check admin only commands case "${MESSAGE}" in # must be private, group admin, or botadmin @@ -136,8 +142,14 @@ else "${WELCOME_MSG} ${NEWMEMBER[FIRST_NAME]} ${NEWMEMBER[LAST_NAME]} (@${NEWMEMBER[USERNAME]})" MYSENTID="${BOTSENT[ID]}" { sleep 5; delete_message "${CHAT[ID]}" "${MYSENTID}"; } & + [ -n "${REPORT_NEWMEMBER}" ] && send_normal_message "$(getConfigKey "botadmin")"\ + "New member: ${CHAT[TITLE]} (${CHAT[ID]}): ${NEWMEMBER[FIRST_NAME]} ${NEWMEMBER[LAST_NAME]} (@${NEWMEMBER[USERNAME]})" fi ;; + '/_left_chat_member'*) + [ -n "${REPORT_LEFTMEMBER}" ] && send_normal_message "$(getConfigKey "botadmin")"\ + "Left member: ${CHAT[TITLE]} (${CHAT[ID]}): ${NEWMEMBER[FIRST_NAME]} ${NEWMEMBER[LAST_NAME]} (@${NEWMEMBER[USERNAME]})" + ;; esac case "${MESSAGE}" in @@ -248,6 +260,14 @@ else [ -f ".jssh" ] && printf "%s: %s\n" "${1}" "Ups, found file \"${PWD:-.}/.jssh\"! ==========" } + # called when bashbot sedn command failed because we can not connect to telegram + # return 0 to retry, return non 0 to give up + bashbotBlockRecover() { + # place your commands to unblock here, e.g. change IP or simply wait + sleep 60 && return 0 # may be temporary + return 1 + } + # place your processing functions here # $1 search parameter diff --git a/mycommands.sh.clean b/mycommands.sh.clean index 0ce5621..cadf216 100644 --- a/mycommands.sh.clean +++ b/mycommands.sh.clean @@ -4,7 +4,7 @@ # files: mycommands.sh.clean # copy to mycommands.sh and add all your commands and functions here ... # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # ########## diff --git a/scripts/interactive.sh.clean b/scripts/interactive.sh.clean index 43d8a88..c2fb222 100755 --- a/scripts/interactive.sh.clean +++ b/scripts/interactive.sh.clean @@ -6,7 +6,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ###### # parameters diff --git a/test/ADD-test-new.sh b/test/ADD-test-new.sh index 7d0867a..bf3500c 100755 --- a/test/ADD-test-new.sh +++ b/test/ADD-test-new.sh @@ -2,7 +2,7 @@ # # ADD a new test skeleton to test dir, but does not activate test # -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # magic to ensure that we're always inside the root of our application, # no matter from which directory we'll run script diff --git a/test/ALL-tests.inc.sh b/test/ALL-tests.inc.sh index 0fb8915..cc2555a 100644 --- a/test/ALL-tests.inc.sh +++ b/test/ALL-tests.inc.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # common variables export TESTME DIRME TESTDIR LOGFILE REFDIR TESTNAME diff --git a/test/a-commit-test.sh b/test/a-commit-test.sh index 816af62..1d81abe 100755 --- a/test/a-commit-test.sh +++ b/test/a-commit-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 ../dev/hooks/pre-commit.sh diff --git a/test/b-example-test.sh b/test/b-example-test.sh index ea67b4a..321938f 100644 --- a/test/b-example-test.sh +++ b/test/b-example-test.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # file: b-example-test.sh -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/c-init-test.sh b/test/c-init-test.sh index e19fc5d..2a13cda 100755 --- a/test/c-init-test.sh +++ b/test/c-init-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/d-JSON.sh-test.sh b/test/d-JSON.sh-test.sh index 549057b..4f70ad2 100755 --- a/test/d-JSON.sh-test.sh +++ b/test/d-JSON.sh-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/d-process_inline-test.sh b/test/d-process_inline-test.sh index d195699..a9f1cb4 100755 --- a/test/d-process_inline-test.sh +++ b/test/d-process_inline-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/d-process_message-test.sh b/test/d-process_message-test.sh index 6a424bf..1513dc6 100755 --- a/test/d-process_message-test.sh +++ b/test/d-process_message-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/d-send_message-test.sh b/test/d-send_message-test.sh index cf512b3..ba8dc19 100755 --- a/test/d-send_message-test.sh +++ b/test/d-send_message-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/d-user_is-test.sh b/test/d-user_is-test.sh index 6c08adf..8c03e7e 100755 --- a/test/d-user_is-test.sh +++ b/test/d-user_is-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh diff --git a/test/e-env-test.sh b/test/e-env-test.sh index 863b37b..2499ad3 100755 --- a/test/e-env-test.sh +++ b/test/e-env-test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ v0.98-0-g5b5447e +#### $$VERSION$$ 0.99-0-g2775000 # include common functions and definitions # shellcheck source=test/ALL-tests.inc.sh