我正在尝试通过 ssh 在远程计算机上运行脚本。为此,我想更改目录并从那里运行脚本。我发现执行此操作的标准方法是:
ssh -Y -t user@server 'cd dir; exec bash'
然而,问题是,在运行我的脚本之前,我需要设置一些进一步的 scipts,我在 ~./bashrc 中执行这些操作。我的问题是,命令的编写方式是在执行 ~./bashrc 之前发生目录更改,即搞乱了我之前需要设置的代码。注意:将命令更改为
ssh -Y -t user@server 'exec bash; cd dir'
正常执行 bash,但之后不会更改目录。提前致谢。
答案1
我的问题是,命令的编写方式是在执行 ~./bashrc 之前发生目录更改
更有可能的是~/.bashrc
根本没有人阅读。 Bash 仅~/.bashrc
在被调用时才读取交互的(非登录)外壳。当您在命令行上发出要运行的命令时ssh
,它会使用该选项执行 shell -c
,这使其成为非交互式。
但您可以通过手动采购来解决这个问题.bashrc
:
ssh -t user@server '. ~/.bashrc; cd dir; exec bash'
某些bashrc
文件会检查 shell 是否是交互式的,并且仅在是交互式的情况下才进行更改。(这听起来没有必要,因为bashrc
只能从交互式 shell 中读取,但由于 Bash 的启动文件的工作方式,bashrc
通常也来源于.bash_profile
或等效文件。)
要解决这个问题,您需要强制交互调用 Bash,如下所示:
ssh -t user@server 'bash -ic "cd /tmp; exec bash"'
.bashrc
现在不需要手动采购,因为-i
Bash 可以自己完成。这第二Bash(来自exec bash
)也可以这样做,所以如果这是一个问题,请将最后一部分替换为exec bash --norc
.
...
将相关设置拆分到不同的文件(例如,)可能是个好主意.thingy.rc
。然后从.bashrc
(如果需要)和 SSH 命令而不是.bashrc
.
答案2
怎么样一个这里文档,如下所示:
ssh user@server << EOF exec bash
cd dir
EOF