-
-
Save lawrenceching/41244a182307940cc15b45e3c4997346 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# Update on 2024/05/29 | |
# 1. use wget to fetch latest frp version when curl was not installed | |
# 2. Remind users that frp will be run in non-root user | |
# 3. Add CI | |
# | |
# Update on 2024/04/13 | |
# 1. Improved OS compatibility: try wget and then curl for downloading files. | |
# | |
# Update on 2024/01/26 | |
# 1. Thanks to GitHub user @aka-Ani, this script now will install latest version of frp: | |
# https://gist.github.com/lawrenceching/41244a182307940cc15b45e3c4997346?permalink_comment_id=4851742#gistcomment-4851742 | |
# 2. Use .toml conf file as .ini became lagacy | |
# | |
# Update on 2023/06/19 | |
# 1. frp no longer provide systemctl service file. This script creates frpc/fprs systemctl service file by itself | |
# 2. Update frp from 0.33.0 to 0.49.0 | |
# 3. User=nobody is no longer suggested, use DynamicUser=yes instead | |
# --- | |
# set platform (latest options as of 2024/01/25), choose one of: | |
# darwin_amd64 | |
# darwin_arm64 | |
# freebsd_amd64 | |
# linux_amd64 | |
# linux_arm | |
# linux_arm64 | |
# linux_mips | |
# linux_mips64le | |
# linux_mipsle | |
# linux_riscv64 | |
# windows_amd64 | |
# windows_arm64 | |
platform=linux_amd64 | |
WGET_INSTALLED=$(command -v wget &> /dev/null && echo 'true') | |
CURL_INSTALLED=$(command -v curl &> /dev/null && echo 'true') | |
if [[ "$WGET_INSTALLED" != 'true' && "$CURL_INSTALLED" != 'true' ]]; then | |
echo "Neither wget nor curl is installed" 1>&2 | |
exit 1 | |
fi | |
# download url can be determined by parsing the json of the releases/latest url. | |
# each asset has a browser_download_url key, and we want the value where the platform is the one chosen above | |
if [[ "$WGET_INSTALLED" == 'true' ]]; then | |
d_url=$(wget -qO- https://api.github.com/repos/fatedier/frp/releases/latest | grep browser_download_url | grep $platform | head -n 1 | cut -d '"' -f 4) | |
else | |
d_url=$(curl -s https://api.github.com/repos/fatedier/frp/releases/latest | grep browser_download_url | grep $platform | head -n 1 | cut -d '"' -f 4) | |
fi | |
echo "Latest version URL: $d_url" | |
wget -q -P /tmp $d_url || curl -O -L --output-dir /tmp $d_url | |
DIR=$(basename $d_url .tar.gz) | |
tar -zxvf /tmp/$DIR.tar.gz -C /tmp | |
mkdir -p /etc/frp | |
cp /tmp/$DIR/frpc.toml /etc/frp/frpc.toml | |
cp /tmp/$DIR/frps.toml /etc/frp/frps.toml | |
cp /tmp/$DIR/frpc /usr/bin/ | |
cp /tmp/$DIR/frps /usr/bin/ | |
echo '[Unit] | |
Description=Frp Client Service | |
After=network.target | |
[Service] | |
Type=simple | |
DynamicUser=yes | |
Restart=on-failure | |
RestartSec=5s | |
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.toml | |
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.toml | |
LimitNOFILE=1048576 | |
[Install] | |
WantedBy=multi-user.target' > /etc/systemd/system/frpc.service | |
echo '[Unit] | |
Description=Frp Server Service | |
After=network.target | |
[Service] | |
Type=simple | |
DynamicUser=yes | |
Restart=on-failure | |
RestartSec=5s | |
ExecStart=/usr/bin/frps -c /etc/frp/frps.toml | |
LimitNOFILE=1048576 | |
[Install] | |
WantedBy=multi-user.target' > /etc/systemd/system/frps.service | |
systemctl daemon-reload | |
systemctl status frpc | |
systemctl status frps | |
echo ' | |
frps and frpc are installed. | |
Modify /etc/frp/frpc.toml or /etc/frp/frps.toml | |
And then run | |
systemctl enable frps | |
systemctl start frps | |
or | |
systemctl enable frpc | |
systemctl start frpc | |
to launch the services | |
Remove "DynamicUser=yes" in .toml files if you want frp run in root (which is not suggested for security reason). | |
' |
@aka-Ani thanks for you contribution!
very helpful! thanks
I actually prefer wget over curl, as debian in my specific environment (lxc in proxmox) has wget preinstalled, but not curl.
So since this cant be used on macOS anyway, I believe wget hat greater compatibility.
I actually prefer wget over curl, as debian in my specific environment (lxc in proxmox) has wget preinstalled, but not curl. So since this cant be used on macOS anyway, I believe wget hat greater compatibility.
I agree!
By the way, for anyone experiencing problems with binding on ports lower than 1024 in frps.toml:
I needed to remove the line: DynamicUser=yes
from the frp-server systemd-config /etc/systemd/system/frps.service
, as it seems the service then does not run as root.
Removing the line does run the service as root, so keep that in mind from a security-perspective.
The best systemd services of all! I've tried another services from different tutorials but yours are most reliable
Great script! Btw, you still need to install curl for the command at the beginning, otherwise it wouldn't install frp at all - thought you should know :)
I keep getting frps.service: Failed at step EXEC spawning /usr/bin/frps: Permission denied
in my service logs. Running it outside of systemd, using sudo works just fine. Anybody have a clue?
I tried setting permissions, changing owners, etc.
I keep getting
frps.service: Failed at step EXEC spawning /usr/bin/frps: Permission denied
in my service logs. Running it outside of systemd, using sudo works just fine. Anybody have a clue?I tried setting permissions, changing owners, etc.
Did you bind on a port <1024? If so, only root/sudo can do that
Great script! Btw, you still need to install curl for the command at the beginning, otherwise it wouldn't install frp at all - thought you should know :)
@pnxl haha truuue, good catch
Great script! Btw, you still need to install curl for the command at the beginning, otherwise it wouldn't install frp at all - thought you should know :)
silly of me. Orz.
fixed.
Also for what its worth, the latest version could be determined in-script with something like this at the beginning: