非常抱歉,这是我的失误。以下是修正后的翻译:
使用方法
上传:
$ curl -v --upload-file ./hello.txt https://transfer.sh/hello.txt
加密并上传:
$ gpg --armor --symmetric --output - /tmp/hello.txt | curl --upload-file - https://transfer.sh/test.txt
下载并解密:
$ curl https://transfer.sh/1lDau/test.txt | gpg --decrypt --output /tmp/hello.txt
上传到病毒检测平台(Virustotal):
$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
删除:
$ curl -X DELETE <X-Url-Delete Response Header URL>
请求头
最大下载次数(Max-Downloads)
$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt -H "Max-Downloads: 1" # 限制下载次数
最大保留天数(Max-Days)
$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt -H "Max-Days: 1" # 设置删除前的天数
X-Encrypt-Password
注意:仅在您的自有服务器上使用此功能:信任第三方服务进行服务器端加密需自行承担风险。
$ curl --upload-file ./hello.txt https://your-transfersh-instance.tld/hello.txt -H "X-Encrypt-Password: test" # 使用“test”作为密码,在服务器端用AES256加密内容
X-Decrypt-Password
注意:仅在您的自有服务器上使用此功能:信任第三方服务进行服务器端加密需自行承担风险。
$ curl https://your-transfersh-instance.tld/BAYh0/hello.txt -H "X-Decrypt-Password: test" # 使用“test”作为密码,在服务器端用AES256解密内容
响应头
X-Url-Delete
用于请求删除文件的URL,作为响应头发送回来。
curl -sD - --upload-file ./hello.txt https://transfer.sh/hello.txt | grep -i -E 'transfer\.sh|x-url-delete'
x-url-delete: https://transfer.sh/hello.txt/BAYh0/hello.txt/PDw0NHPcqU
https://transfer.sh/hello.txt/BAYh0/hello.txt
示例
请查看 examples.md 上的使用示例。
链接别名
创建直接下载链接:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/get/1lDau/test.txt
内联文件:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/inline/1lDau/test.txt
使用方法
参数 | 描述 | 值 | 环境变量 |
listener | 用于HTTP的端口(默认为:80) |
profile-listener | 用于分析器的端口(默认为:6060) | | PROFILE_LISTENER |
force-https | 重定向到HTTPS | false | FORCE_HTTPS |
tls-listener | 用于HTTPS的端口(默认为:443) |
tls-listener-only | 仅启用TLS监听器的标志 | | TLS_LISTENER_ONLY |
tls-cert-file | TLS证书的路径 |
tls-private-key | TLS私钥的路径 | | TLS_PRIVATE_KEY |
http-auth-user | 上传时基本HTTP认证的用户 |
http-auth-pass | 上传时基本HTTP认证的密码 | | HTTP_AUTH_PASS |
http-auth-htpasswd | 上传时基本HTTP认证的htpasswd文件路径 |
http-auth-ip-whitelist | 无需HTTP认证即可上传的IP地址逗号分隔列表 | | HTTP_AUTH_IP_WHITELIST |
ip-whitelist | 允许连接到服务的IP地址逗号分隔列表 |
ip-blacklist | 不允许连接到服务的IP地址逗号分隔列表 | | IP_BLACKLIST |
temp-path | 临时文件夹的路径 | 系统临时路径 | TEMP_PATH |
web-path | 静态网页文件的路径(用于开发或自定义前端) |
proxy-path | 服务在代理后运行时的路径前缀 | | PROXY_PATH |
proxy-port | 服务在代理后运行时的代理端口 |
email-contact | 前端的电子邮件联系方式 | | EMAIL_CONTACT |
ga-key | 前端的谷歌分析(Google Analytics)密钥 |
provider | 使用的存储提供商 | (s3、storj、gdrive或local) |
uservoice-key | 前端的用户反馈(User Voice)密钥 | | USERVOICE_KEY |
aws-access-key | AWS访问密钥 |
aws-secret-key | AWS访问密钥 | | AWS_SECRET_KEY |
bucket | AWS存储桶 |
s3-endpoint | 自定义S3端点 | | S3_ENDPOINT |
s3-region | S3存储桶的区域 | eu-west-1 | S3_REGION |
s3-no-multipart | 禁用S3多部分上传 | false | S3_NO_MULTIPART |
s3-path-style | 强制使用路径样式URL,Minio需要此设置 | false | S3_PATH_STYLE |
storj-access | 项目的访问权限 |
storj-bucket | 项目中使用的存储桶 | | STORJ_BUCKET |
basedir | 本地/gdrive提供商的路径存储 |
gdrive-client-json-filepath | gdrive提供商的OAuth客户端JSON配置文件路径 | | GDRIVE_CLIENT_JSON_FILEPATH |
gdrive-local-config-path | 存储gdrive提供商的本地transfer.sh配置缓存的路径 |
gdrive-chunk-size | gdrive上传的块大小(以兆字节为单位,必须小于可用内存,8MB) | | GDRIVE_CHUNK_SIZE |
lets-encrypt-hosts | 用于Let's Encrypt证书的主机(逗号分隔) |
log | 日志文件的路径 | | LOG |
cors-domains | CORS的域名逗号分隔列表,设置此项可启用CORS |
clamav-host | ClamAV功能的主机 | | CLAMAV_HOST |
perform-clamav-prescan | 通过ClamAV功能对每次上传进行预扫描(clamav-host必须是本地clamd Unix套接字) |
rate-limit | 每分钟请求数 | | RATE_LIMIT |
max-upload-size | 最大上传大小(以千字节为单位) |
purge-days | 上传后自动清除的天数 | | PURGE_DAYS |
purge-interval | 运行自动清除的时间间隔(小时,不适用于S3和Storj) | | PURGE_INTERVAL |
random-token-length | 上传路径的随机令牌长度(删除路径长度为其两倍) | 6 | RANDOM_TOKEN_LENGTH |
如果您想使用Let's Encrypt证书启用TLS,请将lets - encrypt - hosts设置为您的域名,将tls - listener设置为:443并启用force - https。
如果您想使用自己的证书启用TLS,请将tls - listener设置为:443、force - https、tls - cert - file和tls - private - key。
开发
切换到GO111MODULE
go run main.go --provider=local --listener :8080 --temp-path=/tmp/ --basedir=/tmp/
构建
$ git clone git@github.com:dutchcoders/transfer.sh.git
$ cd transfer.sh
$ go build -o transfersh main.go
Docker
为了便于部署,我们创建了官方Docker容器。有两个变体,仅在运行进程的用户上有所不同。
默认的容器将以root
用户运行:
[!警告]
不建议在WatchTower或类似工具中使用latest
标签。latest
标签可能指向未发布的开发版本、测试版本以及旧版本的补丁版本。在transfer.sh支持主版本或次版本标签之前,请使用实际的版本标签。
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/
非root用户
带有-noroot
后缀的标签表示以最低权限运行的镜像构建版本,以减少应用程序被入侵时的攻击面。
[!注意]
建议使用-noroot
版本。
带有-noroot
后缀的容器将使用5000
作为用户ID(UID)和组ID(GID):
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/
标签
名称 | 用途 |
latest | 最新的CI构建版本,可能是每日构建、提交时构建、标签时构建等 |
latest-noroot | 最新的CI构建版本,可能是每日构建、提交时构建、标签时构建等,使用[非root用户] |
nightly | 每天UTC时间午夜的定时CI构建 |
nightly-noroot | 每天UTC时间午夜的定时CI构建,使用[非root用户] |
edge | main 分支每次提交后的最新CI构建 |
edge-noroot | main 分支每次提交后的最新CI构建,使用[非root用户] |
x.y.z | 发布标签后的CI构建 |
x.y.z-noroot | 发布标签后的CI构建,使用[非root用户] |
构建容器
您也可以自行构建容器。这使您可以选择使用哪个UID/GID,例如在使用NFS挂载时:
# 构建参数:
# * RUNAS:如果为空,容器将以root用户运行。
# 设置为任意值可启用UID/GID选择。
# * PUID:进程的UID。需要RUNAS != ""。默认为5000。
# * PGID:进程的GID。需要RUNAS != ""。默认为5000。
docker build -t transfer.sh-noroot --build-arg RUNAS=doesntmatter --build-arg PUID=1337 --build-arg PGID=1338 .
S3使用方法
要使用AWS S3存储桶,您只需指定以下选项:
- provider
--provider s3
- aws - access - key (可通过标志或环境变量
AWS_ACCESS_KEY
设置)
- aws - secret - key (可通过标志或环境变量
AWS_SECRET_KEY
设置)
- bucket (可通过标志或环境变量
BUCKET
设置)
- s3 - region (可通过标志或环境变量
S3_REGION
设置)
如果您指定了s3 - region,则无需设置端点URL,因为会自动使用正确的端点。
自定义S3提供商
要使用非AWS的自定义S3提供商,您需要指定云提供商定义的端点。
Storj网络提供商
要使用Storj网络作为存储提供商,您需要指定以下标志:
- provider
--provider storj
- storj - access (可通过标志或环境变量STORJ_ACCESS设置)
- storj - bucket (可通过标志或环境变量STORJ_BUCKET设置)
创建存储桶和范围
您需要创建一个访问授权(或从上行链路配置中复制)并准备一个存储桶。
首先,登录您的账户,进入访问授权菜单,点击右上角的向导。
输入您选择的访问授权名称,点击“下一步”,并根据需要/偏好进行限制。
之后,继续在CLI或浏览器中操作。接下来,系统会要求您输入用作加密密钥的密码短语。请务必将其保存在安全的地方。没有它,您将无法解密文件!
之后,您可以复制访问授权,然后启动transfer.sh端点。建议将访问授权和存储桶名称作为环境变量提供,以增强安全性。
示例:
export STORJ_BUCKET=<存储桶名称>
export STORJ_ACCESS=<访问授权>
transfer.sh --provider storj
Google Drive使用方法
要使用Google Drive,您需要指定以下选项:
<details><summary>展开</summary>
transfer()
{
local file
declare -a file_array
file_array=("${@}")
if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]]
then
echo "${0} - Upload arbitrary files to \"transfer.sh\"."
echo ""
echo "Usage: ${0} [options] [<file>]..."
echo ""
echo "OPTIONS:"
echo " -h, --help"
echo " show this message"
echo ""
echo "EXAMPLES:"
echo " Upload a single file from the current working directory:"
echo " ${0} \"image.img\""
echo ""
echo " Upload multiple files from the current working directory:"
echo " ${0} \"image.img\" \"image2.img\""
echo ""
echo " Upload a file from a different directory:"
echo " ${0} \"/tmp/some_file\""
echo ""
echo " Upload all files from the current working directory. Be aware of the webserver's rate limiting!:"
echo " ${0} *"
echo ""
echo " Upload a single file from the current working directory and filter out the delete token and download link:"
echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
echo ""
echo " Show help text from \"transfer.sh\":"
echo " curl --request GET \"https://transfer.sh\""
return 0
else
for file in "${file_array[@]}"
do
if [[ ! -f "${file}" ]]
then
echo -e "\e[01;31m'${file}' could not be found or is not a file.\e[0m" >&2
return 1
fi
done
unset file
fi
local upload_files
local curl_output
local awk_output
du -c -k -L "${file_array[@]}" >&2
# be compatible with "bash"
if [[ "${ZSH_NAME}" == "zsh" ]]
then
read $'upload_files?\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "transfer.sh"? (Y/n): \e[0m'
elif [[ "${BASH}" == *"bash"* ]]
then
read -p $'\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "transfer.sh"? (Y/n): \e[0m' upload_files
fi
case "${upload_files:-y}" in
"y"|"Y")
# for the sake of the progress bar, execute "curl" for each file.
# the parameters "--include" and "--form" will suppress the progress bar.
for file in "${file_array[@]}"
do
# show delete link and filter out the delete token from the response header after upload.
# it is important to save "curl's" "stdout" via a subshell to a variable or redirect it to another command,
# which just redirects to "stdout" in order to have a sane output afterwards.
# the progress bar is redirected to "stderr" and is only displayed,
# if "stdout" is redirected to something; e.g. ">/dev/null", "tee /dev/null" or "| <some_command>".
# the response header is redirected to "stdout", so redirecting "stdout" to "/dev/null" does not make any sense.
# redirecting "curl's" "stderr" to "stdout" ("2>&1") will suppress the progress bar.
curl_output=$(curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/")
awk_output=$(awk \
'gsub("\r", "", $0) && tolower($1) ~ /x-url-delete/ \
{
delete_link=$2;
print "Delete command: curl --request DELETE " "\""delete_link"\"";
gsub(".*/", "", delete_link);
delete_token=delete_link;
print "Delete token: " delete_token;
}
END{
print "Download link: " $0;
}' <<< "${curl_output}")
# return the results via "stdout", "awk" does not do this for some reason.
echo -e "${awk_output}\n"
# avoid rate limiting as much as possible; nginx: too many requests.
if (( ${#file_array[@]} > 4 ))
then
sleep 5
fi
done
;;
"n"|"N")
return 1
;;
*)
echo -e "\e[01;31mWrong input: '${upload_files}'.\e[0m" >&2
return 1
esac
}
</details>
Sample output
$ ls -lh
total 20M
-rw-r--r-- 1 <some_username> <some_username> 10M Apr 4 21:08 image.img
-rw-r--r-- 1 <some_username> <some_username> 10M Apr 4 21:08 image2.img
$ transfer image*
10240K image2.img
10240K image.img
20480K total
Do you really want to upload the above files (2) to "transfer.sh"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
Delete command: curl --request DELETE "https://transfer.sh/wJw9pz/image2.img/mSctGx7pYCId"
Delete token: mSctGx7pYCId
Download link: https://transfer.sh/wJw9pz/image2.img
######################################################################################################################################################################################################################################## 100.0%
Delete command: curl --request DELETE "https://transfer.sh/ljJc5I/image.img/nw7qaoiKUwCU"
Delete token: nw7qaoiKUwCU
Download link: https://transfer.sh/ljJc5I/image.img
$ transfer "image.img" | awk --field-separator=": " '/Delete token:/ { print $2 } /Download link:/ { print $2 }'
10240K image.img
10240K total
Do you really want to upload the above files (1) to "transfer.sh"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
tauN5dE3fWJe
https://transfer.sh/MYkuqn/image.img