我目前在远程 Web 服务器上编辑文件的解决方案是使用 Fetch 浏览远程机器和 TextWrangler 进行编辑。但由于我在远程机器上导航命令行变得更舒服(但使用 VIM 不够舒服......),我希望能够在远程机器上输入类似“open filename.txt”的内容并在我的本地机器上打开 TextWrangler。我听说过“反向隧道”一词作为一种选择,但我不知道下一步该做什么。任何建议都非常感谢 - 谢谢!
6 回答
就个人而言,我使用 Cyberduck 作为我的 S/FTP 浏览器。在 Cyberduck 的首选项中,您可以定义一个默认文本编辑器来编辑远程文件。现在,当我选择一个文件时,我可以直接按 Cmd+K,它会在 TextWrangler 中打开。每当我保存时,更改都会自动传输到远程文件。
我实际上是想做同样的事情,没有人写出来,所以我今天想通了。
这有 2 个必需部分和 3 个可选部分:
- 在两台计算机上启用 ssh 登录(必需)
- 设置从远程机器到您的机器的 ssh 隧道(必需)
- 为 ssh 隧道设置别名(可选)
- 在远程机器上为 TextWrangler 设置别名(可选)
- 设置 ssh 密钥,这样您就不必每次都输入密码(可选)
您需要能够从本地 ssh 到远程以运行命令,并且您需要能够从远程 ssh 到本地以便它可以向 TextWrangler 发送命令。
要设置 ssh 隧道,您需要在本地机器上运行如下命令:
ssh -f -N -R 10022:localhost:22 [username on remote machine]@[remote machine hostname]
-f 和 -N 标志将 ssh 置于后台,让你留在你的机器上。-R 标志将远程计算机上的端口绑定到本地计算机上的端口。在端口 10022 上与远程计算机联系的任何内容都将发送到本地计算机上的端口 22。远程端口可以是您想要的任何端口,但您应该选择一个 > 1024 的端口以避免冲突,因此您不必是 root。我选择 10022 是因为它类似于 ssh 的默认端口 22。将括号替换为您的用户名和机器名。
您需要在登录后运行一次。为了使您自己更轻松地执行命令,您可以在您的 bash 配置文件中添加一个别名。将以下内容添加到您的本地~/.bash_profile
:
alias open-tunnel='ssh -f -N -R 10022:localhost:22 [username on remote machine]@[remote machine hostname]'
当然,您可以选择任何您喜欢的别名。
一旦你建立了隧道,你可以在远程机器上使用这样的命令:
ssh -p 10022 [username on local machine]@localhost "edit sftp://[username on remote machine]@[remote machine hostname]//absolute/path/to/file.txt"
-p 标志表示使用端口 10022(或您之前选择的任何端口)。这将导致远程机器连接到您的本地机器并在不打开交互式 ssh 会话的情况下执行双引号中的命令。引号中的命令是您将在本地计算机上运行以在 TextWrangler 中打开远程文件的命令。
为了使您自己更轻松地执行命令,您可以在 bash 配置文件中添加一个函数。将以下内容添加到您的遥控器~/.bash_profile
:
function edit { if [[ ${1:0:1} = "/" ]]; then abs_path="$1"; else abs_path="`pwd`/$1"; fi; ssh -p 10022 [username on local machine]@localhost "edit sftp://[username on remote machine]@[remote machine hostname]/$abs_path"; }
这是假设您没有在远程计算机上安装 TextWrangler 命令行工具。如果这样做,则应将该函数命名为edit
. 例如,tw
。这里,${1:0:1}
看函数第一个参数的第一个字符,应该是文件路径。如果它不以 开头/
,我们通过将当前工作目录 ( pwd
) 添加到开头来计算绝对路径。现在,如果您在远程计算机上/home/jdoe/some/directory/
运行edit some/other/directory/file.txt
,则将在本地计算机上执行以下命令:
edit sftp://[username on remote machine]@[remote machine hostname]//home/jdoe/some/directory/some/other/directory/file.txt
最后,您应该在两个方向上设置 ssh 密钥,这样就不会每次都提示您输入密码。这是别人写的指南:http: //pkeck.myweb.uga.edu/ssh/
我不认为这将允许从命令行打开,但是
带有Remote-System-Explorer 的Eclipse还支持通过 ssh 连接编辑文件
我认为您所指的是通过 ssh 进行的“X11 转发”。查看 ssh_config(5) 联机帮助页进行配置(或仅使用带有 '-X' 参数的 'ssh')。据我所知,这仅适用于 X11 程序(gvim、xemacs 等),因为编辑器实际上是在您要连接的主机上运行 - 只有显示内容发生在您的本地计算机上。所以 TextWrangler 不是一个选项,因为它不是 X11 程序。
我使用 Interarchy(来自 nolobe)进行远程编辑。它是一个相当先进的 ftp/sftp 客户端,可为您提供远程文件的查找器样式视图,并允许您使用您喜欢的编辑器来处理这些文件。
如果你不想为这样的程序付费,密歇根大学有一个名为“Fugu”的开源程序,你也可以使用它。
FileZilla 也提供此功能。你可以在这里下载。连接到 sftp 后,您可以右键单击文本文件并使用您选择的文本编辑器打开它。
最小的答案
您可以使用 Applescript。所以从命令行执行这个:
osascript <<EOF
tell application "TextWrangler"
activate
open location {"sftp://myusername:@my.server:22222//home/username/.bashrc"}
end tell
EOF
笔记
- 显然你不想在每次调用时都在这里输入一个文档,所以我的建议是把这个逻辑放在一个常规的 shell 脚本中:
osascript <<EOF tell application "TextWrangler" activate open location {"$1"} end tell EOF
然后像这样调用脚本:
sh ~/bin/textwrangler.sh "sftp://myusername:@my.server:22222//home/username/.bashrc"
- 每次指定主机限定的路径都会变得乏味,因此要么在脚本中硬编码,要么通过 shell 将脚本调用绑定到击键。对于 bash:
bind '"\et":"sh ~/bin/textwrangler.sh \"sftp://myusername:@my.server:22222/\""'
现在您通过按Alt-t